WPF의 ListBox.SelectedItems (복수 선택)를 검색하는 것이 의외로 어려웠습니다.
제가 게재한 내용을 보다 스마트하게 해 주신 내용이 코멘트 에 있습니다. 나의 후학을 위해서 본 기사의 내용은 그대로 합니다만, 꼭 코멘트에도 눈을 통해 봐 주세요. @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.cspublic 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」
Reference
이 문제에 관하여(WPF의 ListBox.SelectedItems (복수 선택)를 검색하는 것이 의외로 어려웠습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Michio029/items/3b531acd46bb1f81f7d7
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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」
Reference
이 문제에 관하여(WPF의 ListBox.SelectedItems (복수 선택)를 검색하는 것이 의외로 어려웠습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Michio029/items/3b531acd46bb1f81f7d7
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
버튼에 동작을 추가합니다.
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」
Reference
이 문제에 관하여(WPF의 ListBox.SelectedItems (복수 선택)를 검색하는 것이 의외로 어려웠습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Michio029/items/3b531acd46bb1f81f7d7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)