遍历列表框中的项目

时间:2014-02-12 07:23:15

标签: c#

我有一个ListBox(sortedListBox),我已经通过Combobox(allItemsComboBox)中的项目填充了这些:

int index = sortedListBox.FindString(allItemsComboBox.Text, -1);
if (index == -1)
{
    var item=new { Text = allItemsComboBox.Text , Value = allItemsComboBox.Value};
    sortedListBox.Items.Add(item);
}

DisplayedMember sortedListBox为“文字”,ValueMember为“价值”。

现在我想遍历ListBox中的所有项目并获取其值:

public static string ListBoxToString(ListBox lb)
{
    List<string> values = new List<string>();            
    for (int i = 0; i < lb.Items.Count; i++)
    {
        values.Add(lb.Items[i].ToString());  
    }

    string result = String.Join(",", values);
    return result;
}

在这一行:values.Add(lb.Items[i].ToString());我得到:

{ Text = "Size" , Value = "cte1.Size"}

我只想拥有值,即“cte1.Size”

如何遍历ListBox中的项目并获取这些项目的ValueMember

2 个答案:

答案 0 :(得分:2)

我不知道有没有办法让ListBox以这种方式为你评估ValueMember ...而且因为你使用的是匿名类型,所以变得更难获取值。

选项:

  • 改为使用命名类型,并将每个项目转换为
  • 使用动态输入法

例如:

public static string ListBoxToString(ListBox lb)
{
    var values = lb.Items
                   .Cast<dynamic>()
                   .Select(x => x.Value.ToString());
    return string.Join(",", values);
}

动态类型提供了最多立即修复,但我强烈建议您考虑使用自定义类型。 (编写代码不需要多行。)

答案 1 :(得分:1)

您的方法存在两个问题:

1。)ListBox将项目存储为objects的集合,这意味着使用listBox.Items[idx]访问它们只会返回object而不是实际类型。您可以通过将其转换为适当的类型来解决这个问题,但由于下一个问题,它将不适用于您的情况。

2。)您使用var item = new { ... }将项目创建为匿名对象。你不能投射到这种类型。您可以使用dynamic关键字来解决这个问题,但是当您失去类型安全时,我不会这样做。

你可以做的是为你想要存储和使用它的日期创建一个简单的类,而不是匿名类型:

class MyData
{
    public string Text { get; set; }
    public string Value { get; set; }
}