【问题标题】:how to iterate through a listbox selected items and get ValueMember and Display Member如何遍历列表框选定项并获取 ValueMember 和 Display Member
【发布时间】:2017-05-03 06:58:19
【问题描述】:

您好,我正在尝试在 winforms 中遍历列表框的选定项目,如下所示:

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

但我收到以下错误:

无法将“System.Data.DataRowView”类型的对象转换为“System.Windows.Forms.ListBox”类型。

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

【问题讨论】:

  • ValueMember 和 DisplayMember 是与整个 ListBox 相关的属性,而不是与单个项目相关的属性。
  • 而且,您始终可以获得等于ValueMemberDisplayMember 的项目属性。先转换SomeClass obj = item as SomeClass
  • 您无法从一个 ListBox 的 SelectedItems 属性中获取整个 ListBox。

标签: c# listbox selecteditem listboxitems


【解决方案1】:

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

【讨论】:

  • 这样不行,但是方法很接近,看我的回答
  • 将项目投射到 DataRowView 时出现问题
  • @ForgacsNorbert:我不明白你的意思,看看你的答案,同样的过程也在那里发生
  • 'object' 不包含'Row' 的定义,并且找不到接受'object' 类型的第一个参数的扩展方法'Row' #您是否缺少 using 指令或程序集引用?
  • 您的代码。如果您想在此之前随意运行它
【解决方案2】:

我觉得item的类型应该是sknBox.SelectedItems的Element的类型。 我担心你的 sknBox 不会包含其他 ListBox。 或者只使用 var 作为类型。

【讨论】:

    【解决方案3】:

    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);     
    }
    

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

    【讨论】:

      【解决方案4】:

      根据un-lucky的回答,正确的做法是:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • DataRowView 没有 ValueMember 或 DisplayMember 属性。
        猜你喜欢
        • 1970-01-01
        • 2013-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多