WinForms中ListBox设置ValueMember不生效导致SelectedValue为空怎么办?
WinForms ListBox ValueMember不生效问题原因及解决方案
问题原因
- 核心原因:
ValueMember、DisplayMember两个属性仅在ListBox通过DataSource绑定数据源时才会生效,你当前采用循环往Items集合手动添加元素的方式,这两个属性的配置不会被触发,因此SelectedValue返回空值。 - 次要错误:你将
ValueMember和DisplayMember的赋值逻辑放在了foreach循环内,会重复执行多次赋值,属于无效冗余代码,即使使用数据源绑定也应该仅赋值一次。
解决方案
方案1:使用DataSource绑定(官方推荐)
放弃手动添加Items的逻辑,直接将Skill集合赋值给ListBox的DataSource属性,代码如下:
List<Skill> skills = new List<Skill>(); skills.Add(new Skill("1", "Long")); skills.Add(new Skill("2", "Nhi")); // 直接绑定数据源,不需要循环添加元素 listBox1.DataSource = skills; // 仅需赋值一次即可 listBox1.ValueMember = "skillId"; listBox1.DisplayMember = "name";
配置完成后原有读取listBox1.SelectedValue的逻辑不需要修改,即可正常输出skillId的值。
方案2:保留手动加Items逻辑,直接读取SelectedItem
如果你不想修改现有添加元素的逻辑,可以放弃使用SelectedValue,直接将选中项转为Skill类型后读取属性,代码如下:
if (listBox1.SelectedItem is Skill selectedSkill) { Console.WriteLine("value id listbox1:" + selectedSkill.skillId); }
内容的提问来源于stack exchange,提问作者Đức Long
相关产品推荐
相关产品推荐

