C# 如何选中ListBox中与指定特征列表匹配的多个项?
问题原因分析
- 第一次代码报错的原因:
SelectedItems是只读集合,仅支持通过自身的Add()、Remove()、Clear()方法修改选中项,不支持直接赋值操作,因此直接给SelectedItems赋值会触发错误。 - 第二次仅选中一项的原因:
SelectedValue是单选场景下的属性,每次赋值都会清空上一次的选中状态,仅保留当前赋值的项,循环结束后只会保留最后一次遍历到的特征的选中状态。
前置检查
首先需要确认列表框已开启多选模式,将 SelectionMode 属性设置为 Multiple(点击直接切换多选状态)或 Extended(配合Ctrl/Shift键多选),默认的 Single 模式下仅支持选中单个项,无法实现多选效果。
正确实现代码
// 先清空原有选中项,避免旧的选中状态残留 featureListBox.SelectedItems.Clear(); // 遍历当前卡车的所有特征,逐个加入选中集合 foreach (var feature in m.Features) { // 先判断特征是否存在于列表框数据源中,避免添加无效项报错 if (featureListBox.Items.Contains(feature)) { featureListBox.SelectedItems.Add(feature); } }
注意事项
如果你的 Feature 是自定义引用类型,需要确保该类型重写了 Equals 和 GetHashCode 方法,或者在列表框上设置了正确的 SelectedValuePath 属性,否则 Contains 方法会因为引用地址不同,无法正确识别两个逻辑上相同的特征对象,导致匹配失败。如果是按特征ID匹配的场景,可以使用如下写法:
foreach (var feature in m.Features) { var itemToSelect = featureListBox.Items.Cast<Feature>() .FirstOrDefault(f => f.Id == feature.Id); if (itemToSelect != null) { featureListBox.SelectedItems.Add(itemToSelect); } }
内容的提问来源于stack exchange,提问作者BoogieMan
相关产品推荐
相关产品推荐

