我正在尝试过滤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 ++,至少可以清楚地知道幕后发生的事情。
答案 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();