你能完全复制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++,至少会更清楚地了解引擎盖下发生了什么。
这应该可以完成
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();