按索引获取列表框项的值

本文关键字:列表 索引 获取 | 更新日期: 2023-09-27 18:00:45

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

按索引获取列表框项的值

这将是

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

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

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

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

GetItemValue扩展方法

我们可以创建GetItemValue扩展方法来获得类似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

如果您正在处理windows窗体项目,您可以尝试以下操作:

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

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

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

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

我使用的是一个后面有SqlDataReader的BindingSource,上面的都不适用。

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

  ? lst.SelectedValue

但这不是吗?

   ? lst.Items[80].Value

我发现我必须返回BindingSource对象,将其强制转换为System.Data.Common.DbDataRecord,然后引用其列名:

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

这太荒谬了。

这对我有效:

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 list = new ListBox();
Console.Write(list.Items[0].Value);

只需尝试一下"listBox"是您的列表,"yu"是一个veriable,索引0上的值将被分配给它

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