你能完全复制Winforms ComboBox.ObjectCollection吗

本文关键字:ComboBox ObjectCollection Winforms 复制 | 更新日期: 2023-09-27 17:57:47

我正试图过滤掉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++,至少会更清楚地了解引擎盖下发生了什么。

你能完全复制Winforms ComboBox.ObjectCollection吗

这应该可以完成

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 );

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

很清楚幕后发生了什么。一旦你完全取消引用一个对象,你就把它当作不存在一样对待。这里不需要深度复制,只需在清除源集合之前将您想要的数据引用复制到新集合即可。

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();