如何根据指定字符串正确实现ListView多选状态显示?
问题原因及解决方案
问题根源
你当前代码只选中最后一项的核心原因是**SelectedIndex是单选中属性**,每次赋值都会覆盖之前的选中状态,循环执行到最后,只有最后一个匹配项(D对应的索引3)会保留选中状态。另外,用正则匹配提取标识的方式也没必要,直接分割字符串更简洁。
正确实现步骤
首先要确保你的ListView支持多选:
- 如果是普通多选(无复选框):将ListView的
SelectionMode属性设置为MultiSimple或MultiExtended - 如果是复选框多选:将ListView的
CheckBoxes属性设置为true
然后按以下方式修改代码:
方案1:普通多选(无复选框)
string a = "A:B:D"; // 先清空原有选中状态 ListManyOption.SelectedItems.Clear(); // 分割字符串得到每个标识 string[] items = a.Split(':'); foreach (string item in items) { switch (item) { case "A": ListManyOption.SelectedItems.Add(ListManyOption.Items[0]); break; case "B": ListManyOption.SelectedItems.Add(ListManyOption.Items[1]); break; case "C": ListManyOption.SelectedItems.Add(ListManyOption.Items[2]); break; case "D": ListManyOption.SelectedItems.Add(ListManyOption.Items[3]); break; } }
方案2:复选框多选
string a = "A:B:D"; // 先清空原有复选状态 foreach (ListViewItem item in ListManyOption.Items) { item.Checked = false; } // 分割字符串得到每个标识 string[] items = a.Split(':'); foreach (string item in items) { switch (item) { case "A": ListManyOption.Items[0].Checked = true; break; case "B": ListManyOption.Items[1].Checked = true; break; case "C": ListManyOption.Items[2].Checked = true; break; case "D": ListManyOption.Items[3].Checked = true; break; } }
额外优化建议
如果标识(A/B/C/D)和ListView项的对应关系是固定的(比如A对应索引0,B对应1,以此类推),可以不用switch,直接通过字符计算索引,让代码更简洁:
string a = "A:B:D"; ListManyOption.SelectedItems.Clear(); foreach (string str in a.Split(':')) { // 计算索引:A对应0,B对应1,以此类推 int index = str[0] - 'A'; if (index >= 0 && index < ListManyOption.Items.Count) { ListManyOption.SelectedItems.Add(ListManyOption.Items[index]); } }
内容的提问来源于stack exchange,提问作者Rose
相关产品推荐
相关产品推荐

