C#のListViewで選択したアイテムを取得する方法
C#のListViewで選択した行のアイテムを取得します。
目次
ListViewで選択をしたときのイベント
ListViewで選択項目が変更されたとき、SelectionChangedイベントが発生します。
このイベントが発生したときに選択されている項目のインデックスを調べて取り出せば良いわけです。
ListViewで選択されている項目を調べる
ListViewのSelectedItemプロパティは、選択されている最初の項目を取得するプロパティです。
戻り値の型はobjectです。
何も選択されていない場合はnullを返します。
下記のコードは、HogeクラスのコレクションがListViewにバインディングされている場合に、ListView.SelectionItemで選択されているアイテムを取り出して、Hogeクラスにキャストします。そうしてから、取り出したオブジェクトの各プロパティ(MojiとChk)にアクセスしてデータを取り出しています。
// 選択したアイテムをTextBoxに表示する
Hoge item = (Hoge)ListViewMain.SelectedItem;
TextBox1.Text = item.Moji;
CheckBox1.IsChecked = item.Chk;
ListViewで選択されている項目のインデックスを調べる
ListViewのSelectedIndexプロパティは、選択されている項目のうち最初の項目のインデックスを取得するプロパティです。
戻り値の型はInt32です。
何も選択されていない場合は-1を返します。
下記のコードは、ListViewで選択されている項目のインデックスを調べて、何も選択されていない場合はreturn、選択されていればそのインデックス値をTextBlockに表示します。
int id = ListViewMain.SelectedIndex;
if (id < 0) return;
TextBlock1.Text = id.ToString();
項目を1つしか選択できないようにするには
項目を1つしか選択できないように制限するには、ListViewのSelectionModeプロパティをSingleに設定します。
SelectionModeの選択肢は、下表の3つです。
選択肢 |
内容 |
---|---|
Extended |
ShiftやCtrlを押しながら選択することで、複数の項目を選択できる。 |
Multiple |
複数の項目を選択できる。選択方法として、各項目をそれぞれクリックして選択・非選択を選べる。 |
Single |
1つの項目しか選択できない。 |
複数選択した場合でも、SelectedItemやSelectedIndexは最初の項目の情報しか返さないことに注意です。
複数の項目を取得する場合は、SelectedItemsを使ってください。
実施例
ListViewと、TextBlock、TextBox、CheckBoxから成るアプリを作ります。 ListViewの項目を選択すると、その項目のインデックスをTextBlockに、項目の内容をTextBoxとCheckBoxに表示します。
XAML
<Window x:Class="listview_test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:listview_test"
mc:Ignorable="d"
Title="MainWindow" Height="200" Width="400" Loaded="Window_Loaded">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="150" />
</Grid.ColumnDefinitions>
<ListView Name="ListViewMain" Grid.Column="0" ItemsSource="{Binding}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="10" SelectionChanged="ListViewMain_SelectionChanged" >
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding Path=Moji}">
<GridViewColumnHeader Content="文字" />
</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding Path=Chk}">
<GridViewColumnHeader Content="Check" />
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
<StackPanel Grid.Column="1">
<TextBlock Name="TextBlock1" Margin="10,40,10,10" />
<TextBox Name="TextBox1" Margin="10" />
<CheckBox Name="CheckBox1" Content="Check" Margin="10" />
</StackPanel>
</Grid>
</Window>
WindowにLoadedイベントを、ListViewにSelectionChangedイベントを設定します。
WindowのLoadedイベント発生時に、コードの方でListViewにコレクションをバインディングします。GridViewColumnにそれぞれPathでコレクションのプロパティをバインディングします。
コード
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
namespace listview_test
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
ObservableCollection<Hoge> Piyo = new ObservableCollection<Hoge>();
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Piyo.Add(new Hoge() { Moji = "いろは", Chk = true });
Piyo.Add(new Hoge() { Moji = "にほへと", Chk = false });
Piyo.Add(new Hoge() { Moji = "ちりぬるを", Chk = true });
ListViewMain.DataContext = Piyo;
}
private void ListViewMain_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
int id = ListViewMain.SelectedIndex;
if (id < 0) return;
TextBlock1.Text = id.ToString();
if (ListViewMain.SelectedItem == null) return;
Hoge item = (Hoge)ListViewMain.SelectedItem;
TextBox1.Text = item.Moji;
CheckBox1.IsChecked = item.Chk;
}
}
public class Hoge
{
public string Moji { get; set; }
public bool Chk { get; set; }
}
}
HogeクラスのPiyoオブジェクトを、WindowのLoadedイベントでListViewにバインディングします。
ListViewのSelectionChangedイベントで、選択された項目のインデックスを調べてTextBlockに表示します。
また同じイベント内で、選択された項目を取り出してTextBoxとCheckBoxに内容を表示します。
実行結果
下図のように、選択した項目に合わせて表示が切り替わります。
公開日
広告
C#のコントロールカテゴリの投稿
- C#でコレクションの要素の変更をバインド先のコントロールに反映する方法
- C#のComboBoxを使ってみた
- C#のDataGridで右クリックメニューを作ってみた
- C#のDataGridの罫線と背景色を変えてみた
- C#のListBoxでCheckBoxを並べてみた
- C#のListBoxを使ってみた
- C#のListViewで列のタイトルを変える
- C#のListViewで選択したアイテムを取得する方法
- C#のListViewに文字を入力する方法
- C#のListViewのヘッダーをクリックして列をソートする方法
- C#のListViewを使ってみた
- C#のRadioButtonで選択された項目を調べる(foreach編)
- C#のRadioButtonを試してみた
- C#のTextBoxで最下行に自動でスクロールする方法
- C#のWPFのコントロール一覧
- C#のスライダコントロールを試してみた
- C#のタブをコードから切り替える
- C#のメニューのイベントを1つにまとめてみた