Как перебрать список выбранных элементов и получить 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 + ",";
}
}
Другие вопросы по тегам