【问题标题】:Get the value for a listbox item by index通过索引获取列表框项的值
【发布时间】:2011-09-24 03:55:21
【问题描述】:

这一定很容易,但我被卡住了。 我有一个带有 X 项的列表框。每个项目都有一个文本描述(出现在列表框中)和它的值(数字)。 我希望能够使用项目的索引号获取项目的 value 属性。

【问题讨论】:

  • WPF、WinForms、Silverlight 还是 ASP.NET?
  • 添加一些标签,详细说明您正在使用的内容,就像上面 Daniel Hilgarth 所说的那样。
  • 您正在开发 windows 窗体 应用程序吗??
  • 答案取决于列表框的设置。但要获得独立答案,请查看this post

标签: c# .net winforms combobox listbox


【解决方案1】:

这对我有用:

ListBox x = new ListBox();
x.Items.Add(new ListItem("Hello", "1"));
x.Items.Add(new ListItem("Bye", "2"));

Console.Write(x.Items[0].Value);

【讨论】:

  • 据我所知,ListBox.Items 的类型为 System.Windows.Forms.ListBox.ObjectCollection,这意味着 ListBox.Items[index] 是一个没有 Value 属性的对象!!
  • 这是 WebForms 的答案,因为他指的是设置文本和值,这让我假设是 WebForms,而不是 WinForms。
【解决方案2】:

假设您想要第一项的值。

ListBox list = new ListBox();
Console.Write(list.Items[0].Value);

【讨论】:

    【解决方案3】:

    如果您正在处理 Windows 窗体项目,您可以尝试以下方法:

    将项目添加到ListBox 作为KeyValuePair 对象:

    listBox.Items.Add(new KeyValuePair(key, value);
    

    然后您将能够通过以下方式检索它们:

    KeyValuePair keyValuePair = listBox.Items[index];
    var value = keyValuePair.Value;
    

    【讨论】:

    • @tzam:我已经编辑了我的答案。如果您使用所描述的方法,它将起作用...
    • 列表框是数据绑定的,所以它会自动填充...您知道它是如何以这种方式工作的吗?除此之外,您的回答很有效,而且很有帮助!!!
    • @tzam:尝试使用DictionaryItem 而不是KeyValuePair
    【解决方案4】:

    我正在使用一个 BindingSource,后面有一个 SqlDataReader,但以上方法都不适合我。

    微软的问题:为什么会这样:

      ? lst.SelectedValue
    

    但这不是吗?

       ? lst.Items[80].Value
    

    我发现我必须回到 BindingSource 对象,将其转换为 System.Data.Common.DbDataRecord,然后参考其列名:

       ? ((System.Data.Common.DbDataRecord)_bsBlocks[80])["BlockKey"]
    

    现在这太荒谬了。

    【讨论】:

    • 另外,我想我可以遍历 Items 集合,选择每个项目,然后获取 SelectedValue。但我不应该这样做,反正这是一个杂牌。
    • ListBoxItems 集合中的项目是对象类型,它没有 Value 属性。该项目可能是DataRowView、复杂对象或主要类型。该值应使用ValueMember 属性计算,与SelectedValue 的工作方式相同。
    【解决方案5】:

    应该是

    String MyStr = ListBox.items[5].ToString();
    

    【讨论】:

    • 项目可能是DataRowView 或复杂对象或其他类型。项目的基础价值应基于ValueMember 计算。
    【解决方案6】:

    在这里,我什至看不到这个问题的一个正确答案(在 WinForms 标记中),对于如此频繁的问题,这很奇怪。

    ListBox 控件的项目可以是DataRowView、复杂对象、匿名类型、主要类型和其他类型。项目的基础价值应基于ValueMember 计算。

    ListBox 控件有一个GetItemText,它可以帮助您获取项目文本,而不管您添加为项目的对象类型如何。确实需要GetItemValue这样的方法。

    GetItemValue 扩展方法

    我们可以创建GetItemValue Extension Method 来获取类似于GetItemText 的项目值:

    using System;
    using System.Windows.Forms;
    using System.ComponentModel;
    public static class ListControlExtensions
    {
        public static object GetItemValue(this ListControl list, object item)
        {
            if (item == null)
                throw new ArgumentNullException("item");
    
            if (string.IsNullOrEmpty(list.ValueMember))
                return item;
    
            var property = TypeDescriptor.GetProperties(item)[list.ValueMember];
            if (property == null)
                throw new ArgumentException(
                    string.Format("item doesn't contain '{0}' property or column.",
                    list.ValueMember));
            return property.GetValue(item);
        }
    }
    

    使用上述方法,您无需担心ListBox 的设置,它会为项目返回预期的Value。它适用于List<T>ArrayArrayListDataTable、匿名类型列表、主要类型列表和所有其他可用作数据源的列表。下面是一个使用示例:

    //Gets underlying value at index 2 based on settings
    this.listBox1.GetItemValue(this.listBox1.Items[2]);
    

    由于我们创建了GetItemValue 方法作为扩展方法,所以当您要使用该方法时,请不要忘记包含您放置该类的命名空间。

    此方法也适用于ComboBoxCheckedListBox

    【讨论】:

      【解决方案7】:

      试试这个 'listBox' 是你的列表,'yu' 是一个变量,索引 0 上的值将被分配给它

      string yu = listBox1.Items[0].ToString();
      MessageBox.Show(yu);
      

      【讨论】:

      • 事实上在最好的情况下它会返回一个项目的文本。项目可能是DataRowView 或复杂对象或其他类型。项目的基础价值应根据ValueMember计算。
      猜你喜欢
      • 2013-03-05
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 2019-10-15
      • 2014-08-14
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      相关资源
      最近更新 更多