你能完全克隆Winforms ComboBox.ObjectCollection吗?

时间:2014-04-10 10:06:43

标签: c# winforms combobox

我正在尝试过滤winforms组合框中的某些项目。我有一段代码显然不起作用,因为赋值使得指针/引用副本不是深度内容副本。我想我可能在这里使用了错误的方法,可能有更好的解决方案。但我的确切问题是:如何制作组合框项目的完整克隆对象并使用它?这不可能吗?

        ComboBox.ObjectCollection tmpItems = comboBoxKey.Items;
        comboBoxKey.Items.Clear();
        String tmp2 = textBoxSearchKey.Text;
        foreach (object o in tmpItems) //tmpItems has no objects here since it is cleared
        { 
            String tmp1 = o.ToString();
            if (tmp1.IndexOf(tmp2) > 0)
            {
                comboBoxKey.Items.Add(tmp1);
            }
        }

顺便说一下,很多时候C#语言很容易保护我们免受指针的攻击。但是在这种情况下,如果你使用过C或C ++,至少可以清楚地知道幕后发生的事情。

3 个答案:

答案 0 :(得分:1)

很清楚幕后的内容是什么。一旦您完全取消对象,您就会将其视为不存在。这里不需要深度复制,只需在清除源代码之前复制您想要的数据引用。

var newItems = new List<string>();

   foreach (object o in comboBoxKey.Items)
    { 
        String tmp1 = o.ToString();
        if (tmp1.IndexOf(tmp2) > 0)
        {
            newItems.Add(tmp1);
        }
    }
comboBoxkey.DataSource = newItems;

无论你想做什么,你都可以在LINQ查询的一行中做到这一点

comboBoxKey.DataSource = comboBoxKey.Items.Where(i=>i.ToString().IndexOf(tmp2)>0).ToList();

答案 1 :(得分:1)

这应该可以解决问题

var tmpItems = comboBoxKey.Items
            .Cast<Object>()
            .ToArray();
comboBoxKey.Items.Clear();
String tmp2 = textBoxSearchKey.Text;

var filteredItems = tmpItems.Where(x=> x.ToString().Contains(tmp2))
                            .ToArray();
comboBoxKey.Items.AddRange(filteredItems );

答案 2 :(得分:1)

您可以使用Object基类从combobox中捕获Items集合。然后循环它 比如List tmpItems = comboBoxKey.Items.ToList();