通过索引获取列表框项目的值

这一定很容易,但我被卡住了。 我有一个X项目列表框。 每个项目都有一个文本说明(出现在列表框中)及其值(数值)。 我希望能够获得项目的价值属性,使用项目的索引号。

这将是

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

在这里,我看不出这个问题(在WinForms标签中),即使是一个正确的答案,这对于这样一个频繁的问题来说也很奇怪。

ListBox控件的项目可能是DataRowView ,复杂对象,匿名types,主要types和其他types。 一个项目的基础价值应根据ValueMember计算。

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

GetItemValue扩展方法

我们可以创buildGetItemValue 扩展方法来获取像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设置,它会返回一个项目的期望值。 它适用于List<T>ArrayArrayListDataTable ,匿名types列表,主types列表以及所有其他可用作数据源的列表。 这里是一个使用的例子:

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

由于我们创build了GetItemValue方法作为扩展方法,所以当你想使用这个方法的时候,不要忘记包含你放入类的名字空间。

这个方法也适用于ComboBoxCheckedListBox

如果您正在使用Windows窗体项目,则可以尝试以下操作:

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

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

那么你将能够通过以下方式检索它们:

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

我使用了一个BindingSource和一个SqlDataReader,并且以上都不适合我。

问题为微软:为什么这个工作:

  ? lst.SelectedValue 

但是这不?

  ? lst.Items[80].Value 

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

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

现在这太荒谬了。

假设你想要第一个项目的值。

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

这适用于我:

 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是你的列表,而且是一个可以赋值的索引0将被赋值

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