前回
前回ListViewのヘッダーにCheckBoxを追加し全ItemのCheck・Uncheckの方法についてご紹介しました。 gaishiengineer.hatenablog.com
目標
前回に続きCheckBoxを使い「Checkされた項目を選択しメソッドを実行する」を行います。 具体的には 前回と同様の以下のUIで ButtonをクリックしたらCheckマークがついたListViewの行の情報を取得し あるメソッドを実行していきます。
XMALコード
前回のコードに対してButton_Clickを追加
<Button Content="Button" HorizontalAlignment="Left" Margin="21,-41,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
全体のロジックコード
using System; using System.Collections.Generic; using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace Listview_checkbox { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); //ListView List<ListViewItems> items = new List<ListViewItems>(); items.Add(new ListViewItems() { /*items = "000",*/ Selected = true, items1 = "111", items2 = "222", items3 = "333" }); items.Add(new ListViewItems() { /*items = "aaa",*/ Selected = false, items1 = "bbb", items2 = "ccc", items3 = "ddd" }); items.Add(new ListViewItems() { /*items = "AAA",*/ Selected = true, items1 = "BBB", items2 = "CCC", items3 = "DDD" }); ListViewName.ItemsSource = items; } private void Button_Click(object sender, RoutedEventArgs e) { foreach (ListViewItems item in ListViewName.ItemsSource) { //item.Selectedがtrueの場合 if (item.Selected) { Excute(item.items1); } } } private void Excute(string items1) { Console.WriteLine(items1); } private void chkSelectAll_Checked(object sender, RoutedEventArgs e) { foreach (ListViewItems item in ListViewName.ItemsSource) { ListViewName.SelectedItems.Add(item); } } private void chkSelectAll_Unchecked(object sender, RoutedEventArgs e) { foreach (ListViewItems item in ListViewName.ItemsSource) { ListViewName.SelectedItems.Remove(item); } } private void ListViewName_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.AddedItems.Count > 0) { //------------ ListViewItems user = (ListViewItems)e.AddedItems[0]; ListViewItem lvi = (ListViewItem)ListViewName.ItemContainerGenerator.ContainerFromItem(user); CheckBox chkBx = FindVisualChild<CheckBox>(lvi); if (chkBx != null) chkBx.IsChecked = true; //------------ } else // Remove Select All chkBox { ListViewItems user = (ListViewItems)e.RemovedItems[0]; ListViewItem lvi = (ListViewItem)ListViewName.ItemContainerGenerator.ContainerFromItem(user); CheckBox chkBx = FindVisualChild<CheckBox>(lvi); if (chkBx != null) chkBx.IsChecked = false; } } public static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject { if (depObj != null) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) { DependencyObject child = VisualTreeHelper.GetChild(depObj, i); if (child != null && child is T) { return (T)child; } T childItem = FindVisualChild<T>(child); if (childItem != null) return childItem; } } return null; } } public class ListViewItems { //public string items { get; set; } public bool Selected { get; set; } public string items1 { get; set; } public string items2 { get; set; } public string items3 { get; set; } } }
解説
ロジックコードで追加した部分です。
private void Button_Click(object sender, RoutedEventArgs e) { foreach (ListViewItems item in ListViewName.ItemsSource) { //item.Selectedがtrueの場合 if (item.Selected) { Excute(item.items1); } } } private void Excute(string items1) { Console.WriteLine(items1); }
クリックメソッドを実行すると、foreach文が実行されます。 foreachでは「XMALのNameを"ListViewName"としたListView」の生成に使用されるコレクションから各要素を一つずつ取り出します。 各要素はListViewItemsクラスで定義された変数を保持しておりListViewの行に対応しています。 ここではitem1変数を引数としてメソッドExcuteを実行しています。 例えばListViewの項目1をテスト名にして、Checkしたテスト名だけを選択してメソッドを実行するなんてこともできるようになります。