如何遍历列表框选择的项目并获取 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.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);
}
如果您出于某种原因需要灵活,我想您可以确定项目的类型并使用反射来调用 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);
}
}
从错误消息中可以清楚地看出 .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());
}
根据倒霉的回答,正确的做法是:
foreach (DataRowView item in sknBox.SelectedItems)
{
Console.WriteLine(item.Row["ID"].ToString());
Console.WriteLine(item.Row["Description"].ToString());
}
你好,我正在尝试像这样循环访问 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.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);
}
如果您出于某种原因需要灵活,我想您可以确定项目的类型并使用反射来调用 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);
}
}
从错误消息中可以清楚地看出 .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());
}
根据倒霉的回答,正确的做法是:
foreach (DataRowView item in sknBox.SelectedItems)
{
Console.WriteLine(item.Row["ID"].ToString());
Console.WriteLine(item.Row["Description"].ToString());
}