如何遍历列表框选择的项目并获取 ValueMember 和 Display Member

how to iterate through a listbox selected items and get ValueMember and Display Member

你好,我正在尝试像这样循环访问 winforms 中列表框的选定项目:

foreach (ListBox item in sknBox.SelectedItems)            
{              
    Console.WriteLine(item.ValueMember);
    Console.WriteLine(item.DisplayMember);     
}

但我收到以下错误:

Unable to cast object of type 'System.Data.DataRowView' to type 'System.Windows.Forms.ListBox'.

有办法解决这个问题吗?还是其他直接的解决方案?

我觉得item的类型应该是sknBox.SelectedItems的Element的类型。 恐怕你的 sknBox 不会包含其他列表框。 或者只使用 var 作为类型。

ListBox.SelectedItemsObject 而非 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);     
}

如果您出于某种原因需要灵活,我想您可以确定项目的类型并使用反射来调用 getter 任何分配给 ValueMember 和 DisplayMember 的 属性。

开始之前:我不是 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);    
    } 
}

从错误消息中可以清楚地看出 .SelectedItemsSystem.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());     
}

根据倒霉的回答,正确的做法是:

foreach (DataRowView item in sknBox.SelectedItems)
{
    Console.WriteLine(item.Row["ID"].ToString());
    Console.WriteLine(item.Row["Description"].ToString());
}