C#のListViewで選択したアイテムを取得する方法

C#のListViewで選択した行のアイテムを取得します。

目次

  1. ListViewで選択をしたときのイベント
  2. ListViewで選択されている項目を調べる
  3. ListViewで選択されている項目のインデックスを調べる
  4. 項目を1つしか選択できないようにするには
  5. 実施例
    1. XAML
    2. コード
    3. 実行結果

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に内容を表示します。

実行結果

下図のように、選択した項目に合わせて表示が切り替わります。

起動時 1番目 2番目 3番目

公開日

広告