WPF의 ListBox.SelectedItems (복수 선택)를 검색하는 것이 의외로 어려웠습니다.

16051 단어 ListBoxC#WPF
(2020/09/17 추가)
제가 게재한 내용을 보다 스마트하게 해 주신 내용이 코멘트 에 있습니다. 나의 후학을 위해서 본 기사의 내용은 그대로 합니다만, 꼭 코멘트에도 눈을 통해 봐 주세요. @soi씨 지적, 해설 감사합니다.

(2020/09/18 추가)
리스트 박스가 복수 있는 경우에, 코드량을 보다 적게 하는 방법을 생각해 왔으므로, 여기 에 썼습니다.

(2020/09/26 추가)
내가 아는 가운데 가장 간단한 ListBox.SelectedItems를 얻는 방법을 다른 기사의 코멘트에 받았습니다.

배경



WPF 에 준비되어 있는 ListBox 의 SelectedItem 은 간단하게 꺼낼 수 있습니다만 SelectedItem"s"를 꺼내는데 조금 고생했기 때문에 그 비망록입니다.

SelectedItem(단체 선택)의 꺼내는 방법은 다른 기사 에 썼습니다.

준비



ListBox와 그 내용을 준비합니다.


MainWindow.xaml
<Window><!-- Windowの細かいのは省略 -->
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>

        <ListBox Grid.Row="0" Name="ExampleList" Margin="10" SelectionMode="Extended" ScrollViewer.VerticalScrollBarVisibility="Auto">
            <!-- SelectionMode="Extended" :ctrl,shift+クリックで複数選択可能 -->
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Id, StringFormat=IDは{0} :}"/>
                        <TextBlock Text="{Binding Name, StringFormat= Nameは{0} :}"/>
                        <TextBlock Text="{Binding Age, StringFormat= Ageは{0}}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Button Grid.Row="1" Name="Btn" Content="ボタン" Margin="100,10,100,10" Click="Btn_Click"/>
    </Grid>
</Window>

<TextBlock Text="{Binding Id, StringFormat=IDは{0} :}"/>이 근처의 문자열 형식을 쓰는 방법에 대해서는 여기에서 자세히 설명합니다.
htps : // 코 m / 코 아라 - 1 / / ms / 815 에 b5146b3-dc48 아 8c3

MainWindow.xaml.cs
public partial class MainWindow : Window
{
    List<ExampleClass> list = new List<ExampleClass>();
    public MainWindow()
    {
        InitializeComponent();

        list.Add(new ExampleClass() { Id = 0, Name = "aaa", Age = 10 });
        list.Add(new ExampleClass() { Id = 1, Name = "bbb", Age = 20 });
        list.Add(new ExampleClass() { Id = 2, Name = "ccc", Age = 30 });
        list.Add(new ExampleClass() { Id = 3, Name = "ddd", Age = 40 });
        list.Add(new ExampleClass() { Id = 4, Name = "eee", Age = 50 });
        ExampleList.ItemsSource = list;
    }

    private void Btn_Click(object sender, RoutedEventArgs e)
    {

    }
}
class ExampleClass
{
    public int Id { get; set; }
    public string Name { get; set; }
    public byte Age { get; set; }
}

선택 상태의 내용을 살펴보기



복수 선택시의 내용이 어떻게 되어 있는지 알고 싶기 때문에, 버튼을 누르는 곳에서 브레이크 포인트를 설정해 봅니다.

버튼을 눌러 브레이크합니다.

아무래도 SelectedItems 자체는 배열이 되어 있어 그 내용이 SelectedItem 과 같습니다.
Count 는 0 보다는 1 부터 시작하는 것 같네요. 3개 선택중이므로 3.

이것을 보면 foreach 안에서 SelectedItem(단체 선택)을 꺼낼 때와 같은 일을 하면 꺼낼 수 있는 생각이 듭니다.

SelectedItems(복수 선택) 검색



버튼에 동작을 추가합니다.
    private void Btn_Click(object sender, RoutedEventArgs e)
    {
        // 選択項目が0 => メソッドを出る
        if (ExampleList.SelectedItems.Count == 0)
            return;

        // 空の配列を宣言
        int[] _id = new int[0];
        string[] _name = new string[0];
        byte[] _age = new byte[0];

        int i = 0;

        // SelectedItemsの中身を取り出す
        foreach (var oneItemLine in ExampleList.SelectedItems)
        {
            // 配列の箱を一つ増やす
            int reLength = _id.Length + 1;
            Array.Resize(ref _id, reLength);
            Array.Resize(ref _name, reLength);
            Array.Resize(ref _age, reLength);

            // ExampleClassとして取り出す
            ExampleClass item = oneItemLine as ExampleClass;
            _id[i] = item.Id;
            _name[i] = item.Name;
            _age[i] = item.Age;
            i++;
        }

        // 三つ選択がある(SelectedItems.Count=3)としたら、3回ループして欲しい(n=0,1,2)ので n < SelectedItems.count
        for (int n = 0; n < ExampleList.SelectedItems.Count; n++)
        {
            Console.WriteLine("Id:「{0}」 Name:「{1}」 Age:「{2}」", _id[n], _name[n], _age[n]);
        }
    }

실행하고 버튼을 누르십시오.
Id:「0」 Name:「aaa」 Age:「10」
Id:「1」 Name:「bbb」 Age:「20」
Id:「2」 Name:「ccc」 Age:「30」

잡혔다.

아무래도 항목은 선택한 순서대로 들어가는 것 같습니다.
Id:「4」 Name:「eee」 Age:「50」
Id:「2」 Name:「ccc」 Age:「30」
Id:「0」 Name:「aaa」 Age:「10」

좋은 웹페이지 즐겨찾기