【WPF】データグリッドにチェックボックス列を設けてワンクリックでチェックできるようにする
おはようございます。
今回は、Datagrid にチェックボックス列を追加し、
選択したデータを削除できるようにしたいと思います。
デフォルトで、「DataGridCheckBoxColumn」というのがあるのですが、
これだと行を選択したあとにチェックしなければならず、なんか操作性が悪いため別の方法で実装します。
いつも通り、前回のプログラムを流用します。
https://www.doraxdora.com/blog/2017/08/09/post-1956/
スポンサーリンク
画面の修正
データグリッド列の先頭に次の「DataGridTemplateCoumn」を追加します。
MainWindow.xaml
1 2 3 4 5 6 7 | <DataGridTemplateColumn IsReadOnly="True"Header="選択"Width="50"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"HorizontalAlignment="Center"VerticalAlignment="Center" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> |
プログラム修正
クラス追加
チェックボックスにバインドする列を追加したクラスを作成します。
CatModel.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; namespaceWpfApp1 { publicclassCatModel { publicCatModel(){ } publicCatModel(intNo,StringName,StringSex,intAge,StringKind,StringFavorite){ this.IsChecked=false; this.No=No; this.Name=Name; this.Sex=Sex; this.Age=Age; this.Kind=Kind; this.Favorite=Favorite; } publicBooleanIsChecked{get;set;} publicintNo{get;set;} publicStringName{get;set;} publicStringSex{get;set;} publicintAge{get;set;} publicStringKind{get;set;} publicStringFavorite{get;set;} } } |
データ取得処理の修正
取得したデータを作成したクラスにマッピングします。
MainWindow.xaml.cs
1 2 3 4 5 6 | List<CatModel>resultList=newList<CatModel>(); foreach(Cat cat inresult.ToList()) { resultList.Add(newCatModel(cat.No,cat.Name,cat.Sex,cat.Age,cat.Kind,cat.Favorite)); } e.Result=resultList; |
データグリッドに設定する処理の修正
データグリッドに設定するリストのクラスを変更します。
MainWindow.xaml.cs
1 2 3 4 5 6 7 8 9 10 | /// <summary> /// 検索完了処理(非同期) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> privatevoidSearchProcessCompleted(objectsender,RunWorkerCompletedEventArgse) { this.dataGrid.ItemsSource=e.Result asList<CatModel>; ToggleProgressRing(); } |
削除処理の修正
削除ボタンがクリックされたら、
チェックボックスが選択されているデータを削除するように修正します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /// <summary> /// 削除ボタンクリックイベント /// </summary> /// <param name="sender"></param> /// <param name="e"></param> privatevoiddel_button_Click(objectsender,RoutedEventArgse) { logger.Info("削除ボタンクリック"); // データを削除する using(varcontext=newPgDbContext()) { intcheckCount=0; List<CatModel>list=this.dataGrid.ItemsSource asList<CatModel>; foreach(CatModel cat inlist) { if(cat.IsChecked) { checkCount++; // 対象のテーブルオブジェクトを取得 vartable=context.Cats; // テーブルから対象のデータを取得 vartarget=table.Single(x=>x.No==cat.No); // データ削除 table.Remove(target); // DBの変更を確定 context.SaveChanges(); } } if(checkCount== 0) { MessageBox.Show("削除対象にチェックがされていません。"); return; } } // データ再検索 searchData(); MessageBox.Show("データを削除しました。"); } |
起動してみる
追加したチェックボックスをいくつかチェックして削除ボタンをクリックします。
無事にデータが削除されました。
まとめ
データグリッドにチェックボックスをつけるって
結構よくある要件ですよね。
とりあえずはこんな感じでいいんじゃないでしょうか。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません