C# WinForm ListBox绑定对象时自定义显示多属性拼接文本
实现方法
不用修改ToString()(毕竟你另一个ListBox已经靠ToString()输出其他格式了),也不用额外写包装类,WinForm的ListBox原生支持存储实体对象、自定义显示文本,用DisplayMember属性就能搞定,全程不用动你已经写好的业务逻辑。
第一步:给House类补个只读属性
你已经写好了GetHouseNameStudentsTasks()生成显示文本,直接套一层公共只读属性就行——ListBox的DisplayMember只认公共属性,不认直接的方法返回值:
// 直接加到House类里即可,原有生成文本的方法完全不用改 public string FullInfoDisplay { get { return GetHouseNameStudentsTasks(); } }
第二步:初始化时给ListBox指定显示属性
在窗体构造函数的InitializeComponent()调用之后,给lbHousesAllInfo加一行配置:
// 指定列表项显示时取FullInfoDisplay属性的值 lbHousesAllInfo.DisplayMember = nameof(House.FullInfoDisplay); // 不需要额外指定ValueMember,项集合里存的就是完整House对象
用
nameof()代替硬编码字符串,后续改属性名的时候不会出现配置不匹配的问题。
第三步:原有添加逻辑完全不用动
你现在按钮点击事件里直接添加House对象的代码可以原封不动保留:
private void btnSaveHouse_Click(object sender, EventArgs e) { House selectedHouse = lbHouses.SelectedItem as House; // 你原来写的其他业务逻辑 lbHousesAllInfo.Items.Add(selectedHouse); // 此时列表项显示的就是GetHouseNameStudentsTasks()拼接出来的文本, // 后续取lbHousesAllInfo.SelectedItem强转成House类型就能直接用,完全不会丢失原始对象引用 }
注意事项
- 这个方案完全不影响另一个ListBox的展示:因为没有修改
ToString()的返回值,原来靠ToString()输出的格式不会有任何变化 - 如果后续房屋的任务包、学生列表有更新,只要在House类里实现
INotifyPropertyChanged接口,对应数据变更时触发FullInfoDisplay的属性变更通知,列表显示的内容会自动刷新,不用手动重绘控件 - 不要直接往Items集合里塞方法返回的字符串,那样项里存的就是字符串类型,后续没法取原始House对象做业务处理
内容的提问来源于stack exchange,提问作者Miles
相关产品推荐
相关产品推荐

