質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

データバインディング

データソースと、アプリケーションやウェブページ(ウェブアプリケーション)のユーザインタフェースを静的または動的に結合する技術です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

解決済

[WPF] DataGridViewへチェックボックスを配置した時のチェックされた行のデータを取得したい

TEC_S
TEC_S

総合スコア79

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

データバインディング

データソースと、アプリケーションやウェブページ(ウェブアプリケーション)のユーザインタフェースを静的または動的に結合する技術です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1回答

0グッド

1クリップ

1528閲覧

投稿2021/05/28 03:28

前提・実現したいこと

WPFでDataGridViewを利用して、チェックボックス付きのデータリスト一覧を表示。
表示は対象フォルダ内のファイル一覧になります。チェックボックスを入れると、対象ファイル名を取得してファイルに対して色々な編集をするプログラムを作成しています。

DataGridViewにチェックボックスを配置して、ファイル一覧を表示させるところまでは出来たのですが、チェックボックスをクリックした際に対象の行を読み取ることが出来なくて困っています。よろしくお願いいたします。

発生している問題・エラーメッセージ

チェックボックスをチェックされた時に、対象のファイル名(DataContextで取得できる?)を取得したいが、取得できない。

該当のソースコード

xamle

1<Window x:Class="DataGridViewOrTab.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:DataGridViewOrTab" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 <Grid> 10 <TabControl> 11 <TabItem Header="対象フォルダ1"> 12 <DataGrid Name="forder1DataGrid" IsReadOnly="True" AutoGenerateColumns="False" VerticalScrollBarVisibility="Auto" Height="auto"> 13 <DataGrid.Columns> 14 <DataGridTemplateColumn Header="対象"> 15 <DataGridTemplateColumn.CellTemplate> 16 <DataTemplate> 17 <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" VerticalAlignment="Center" Click="folder1_click" /> 18 </DataTemplate> 19 </DataGridTemplateColumn.CellTemplate> 20 </DataGridTemplateColumn> 21 <DataGridTextColumn Header="ファイル名" Binding="{Binding FileName}" /> 22 <DataGridTextColumn Header="備考" Binding="{Binding Comment}" /> 23 </DataGrid.Columns> 24 </DataGrid> 25 </TabItem> 26 <TabItem Header="対象フォルダ2"> 27 <DataGrid Name="forder2DataGrid" IsReadOnly="True" AutoGenerateColumns="False" VerticalScrollBarVisibility="Auto" Height="auto"> 28 <DataGrid.Columns> 29 <DataGridTemplateColumn Header="対象"> 30 <DataGridTemplateColumn.CellTemplate> 31 <DataTemplate> 32 <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" VerticalAlignment="Center" /> 33 </DataTemplate> 34 </DataGridTemplateColumn.CellTemplate> 35 </DataGridTemplateColumn> 36 <DataGridTextColumn Header="ファイル名" Binding="{Binding FileName}" /> 37 <DataGridTextColumn Header="備考" Binding="{Binding Comment}" /> 38 </DataGrid.Columns> 39 </DataGrid> 40 </TabItem> 41 </TabControl> 42 </Grid> 43</Window> 44

C#

1 private void folder1_click(object sender, RoutedEventArgs e) 2 { 3 //ここでクリックしたデータグリッドのDataContextを取得したい... 4 System.Collections.Generic.List<orgFileInfo> tmpList = this.forder1DataGrid.ItemsSource as System.Collections.Generic.List<orgFileInfo>; 5 foreach(orgFileInfo ofile in tmpList) 6 { 7 if (ofile.IsChecked) 8 { 9 string name = ofile.FileName; 10 } 11 } 12 13 14 15 //Checkboxの内容は取得できない(何も入ってこない) 16 if(sender is System.Windows.Controls.CheckBox) 17 { 18 string str = ((System.Windows.Controls.CheckBox)sender).Tag + "がクリックされました。"; 19 } 20 21 }

C#

1 class orgFileInfo 2 { 3 public bool IsChecked { get; set; } 4 public string FileName { get; set; } 5 public string Comment { get; set; } 6 }

試したこと

1)下記サイトを参考に、DataGridViewのItemSouceから取得できないかやってみたが、ItemSouceは空で何も取得できなかった
参考:https://www.doraxdora.com/blog/2017/08/12/post-1997/

2)CheckBoxの内容も取得できるか試したが、何も取得できなかった。

補足情報(FW/ツールのバージョンなど)

VisualStudio2019 / Winows10

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

ベストアンサー

Windows FormsのDataGridViewと紛らわしいので、
DataGridと正しく表記してください。

チェックボックスをチェックされた時に、対象のファイル名(DataContextで取得できる?)を取得したいが、取得できない。

  1. senderCheckBoxにキャスト
  2. さらにCheckBoxDataContextorgFileInfoにキャスト

で取得できます。

C#

1using System.Collections.Generic; 2using System.Diagnostics; 3using System.Windows; 4using System.Windows.Controls; 5 6namespace Questions340821 7{ 8 public partial class MainWindow : Window 9 { 10 public MainWindow() 11 { 12 InitializeComponent(); 13 14 forder1DataGrid.ItemsSource = new List<orgFileInfo> 15 { 16 new orgFileInfo{ FileName = "FileName1", Comment = "Comment1", }, 17 new orgFileInfo{ FileName = "FileName2", Comment = "Comment2", }, 18 new orgFileInfo{ FileName = "FileName3", Comment = "Comment3", }, 19 }; 20 } 21 22 private void folder1_click(object sender, RoutedEventArgs e) 23 { 24 if (sender is CheckBox checkBox) 25 { 26 if (checkBox.DataContext is orgFileInfo info) 27 { 28 Debug.WriteLine("IsChecked:" + info.IsChecked); 29 Debug.WriteLine("FileName:" + info.FileName); 30 Debug.WriteLine("Comment:" + info.Comment); 31 Debug.WriteLine(""); 32 } 33 } 34 } 35 } 36}

投稿2021/05/28 08:57

TN8001

総合スコア8046

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

TEC_S

2021/05/29 14:23

ありがとうございます。 DataGridの表記の件、勘違いしておりました。 ご提示いただいた方法で、チェックしたデータの取得に成功しました。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

データバインディング

データソースと、アプリケーションやウェブページ(ウェブアプリケーション)のユーザインタフェースを静的または動的に結合する技術です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです