按索引获取列表框项的值
本文关键字:列表 索引 获取 | 更新日期: 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>
、Array
、ArrayList
、DataTable
、匿名类型列表、主要类型列表以及所有其他可用作数据源的列表配合使用。下面是一个用法示例:
//Gets underlying value at index 2 based on settings
this.listBox1.GetItemValue(this.listBox1.Items[2]);
由于我们创建了GetItemValue
方法作为扩展方法,所以当您想要使用该方法时,不要忘记包含您将该类放入的命名空间。
该方法同样适用于ComboBox
和CheckedListBox
。
如果您正在处理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);