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

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

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

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

データバインディング

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

WPF

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

Q&A

解決済

1回答

3766閲覧

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

TEC_S

総合スコア79

DataGrid

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

データバインディング

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

WPF

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

1グッド

0クリップ

投稿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

TN8001👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

で取得できます。

cs

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

編集2023/07/27 14:23
TN8001

総合スコア9807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TEC_S

2021/05/29 14:23

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問