【发布时间】:2011-12-07 18:45:18
【问题描述】:
我在使用 C# .Net 中的复选框控件时遇到了奇怪的问题
我下面的代码显示了所需的所有逻辑 - _itemsChecked 是一个私有字典,包含所有 _fixture 以及它们是真还是假(选中或未选中)
我想要的是能够搜索我的检查列表,同时保留之前检查过的那些。如果搜索结果中包含选中的项目,我希望它被选中。
代码几乎可以正常工作!但是由于某种原因,这里和那里随机检查框,它似乎可以通过调试工作,但是当屏幕返回到控件时,它就没有工作了。
当然,我错过了一些非常简单的东西。
我的逻辑是:
DataSource 包括与键入的搜索查询匹配的那些, 遍历此列表并检查字典中的 Guid 是否为真。 如果它是真的,那么我们将它设置为选中。
希望我提供了足够的信息。
非常感谢。
private void searchTextBox_KeyUp(object sender, EventArgs e)
{
lst.DataSource = _fixtures
.OrderBy(f =>
f.Description)
.Where(f =>
f.Description.ToLower().Contains(searchFixturesTextBox.Text.ToLower()))
.ToList();
lst.DisplayMember = "Description";
for (var i = 0; i < lst.Items.Count; i++)
if(_itemsChecked.Contains(new KeyValuePair<Guid, bool>(((Fixture)lst.Items[i]).Guid, true)))
lst.SetItemChecked(i, true);
}
void lst_ItemCheck(object sender, ItemCheckEventArgs e)
{
var selectedItem = ((ListBox) sender).SelectedItem as Fixture;
if (selectedFixtureItem != null)
_itemsChecked[selectedItem.Guid] = e.CurrentValue == CheckState.Unchecked;
}
【问题讨论】:
-
_itemsChecked.Contains(new KeyValuePair<Guid, bool>(((Fixture)lst.Items[i]).Guid, true))- 看起来效率低下,我认为 LINQ 可能会遍历整个集合。如果这是一个“普通”的 .net 字典,为什么不定义bool isUnchecked;然后使用:_itemsChecked.TryGetValue(((Fixture)lst.Items[i]).Guid, out isUnchecked) && isUnchecked代替? -
我已经解决了这个问题,但经验太少,无法完整发布答案。我会在星期一这样做。
selectedItem = ((ListBox) sender).SelectedItem as Fixture;改为var selectedFixtureItem = lstFixtures.Items[e.Index] as Fixture;
标签: c# .net dictionary checkedlistbox