Как перебрать список выбранных элементов и получить ValueMember и Display Member
Здравствуйте, я пытаюсь перебрать выбранные элементы списка в winforms, как это:
foreach (ListBox item in sknBox.SelectedItems)
{
Console.WriteLine(item.ValueMember);
Console.WriteLine(item.DisplayMember);
}
Но я получаю следующую ошибку:
Невозможно привести объект типа "System.Data.DataRowView" к типу "System.Windows.Forms.ListBox".
Есть ли способ это исправить? или другое прямолинейное решение?
5 ответов
Из сообщения об ошибке ясно, что .SelectedItems
это коллекция System.Data.DataRowView
, так что вы можете получить доступ к необходимым значениям через Row
с индексаторами, как показано ниже:
foreach (var item in sknBox.SelectedItems)
{
Console.WriteLine(((DataRowView)item).Row["Value-member-name-here"].ToString());
Console.WriteLine(((DataRowView)item).Row["Display-member-name-here"].ToString());
}
Я думаю, что тип элемента должен быть типом элемента sknBox.SelectedItems. Я боюсь, что ваш sknBox не будет содержать другие ListBoxes. Или просто используйте var для типа.
ListBox.SelectedItems
это коллекция Object
не ListBox
,
Самый простой подход - это жестко закодировать его так:
foreach (Object item in sknBox.SelectedItems)
{
Console.WriteLine((item as MyObject).Value); // or whatever it happens to be
Console.WriteLine((item as MyObject).Label);
}
Если вам по какой-то причине нужно проявить гибкость, я думаю, вы могли бы определить тип элемента и использовать отражение для вызова метода получения любого свойства, назначенного для ValueMember и DisplayMember.
Основываясь на неудачном ответе, правильный способ сделать это:
foreach (DataRowView item in sknBox.SelectedItems)
{
Console.WriteLine(item.Row["ID"].ToString());
Console.WriteLine(item.Row["Description"].ToString());
}
Прежде чем я начну: я не уверен на 100% в именах классов в winform (в частности, ListBoxItem), поэтому обязательно посмотрите их при необходимости.
Вы должны привести предметы к правильному типу, прежде чем вы сможете использовать их, как вы
foreach (ListBoxItem item in sknBox.SelectedItems)
{
if(item is DataRowView) //Check if the item can be cast to your class
{
DataRowView drwItem = item as DataRowView;
Console.WriteLine(drwItem.ValueMember);
Console.WriteLine(drwItem.DisplayMember);
}
}
string Selectedlist = "";
foreach (ListItem item in ListBox_YourListBox.Items)
{
if (item.Selected==true)
{
Selectedlist += item + ",";
}
}