如何在ListView中显示带多属性的自定义Book类对象列表?
在ListView中展示多属性Book对象列表的实现方法
问题背景
我定义了一个包含多属性的Book类,还写了一个返回对象列表的静态方法,代码如下:
class Book { public string Title { get; set; } public string Author { get; set; } public string Year { get; set; } public static List<Book> GetList() { var bookList = new List<Book>(); bookList.Add(new Book { Author = "Robin Cook", Title = "Vector", Year = "1999" }); bookList.Add(new Book { Author = "J.K. Rowling", Title = "Harry Potter and Prisoner of Azkaban", Year = "1999" }); bookList.Add(new Book { Author = "George R.R. Martin", Title = "A Dance with Dragons", Year = "2011" }); // 补全未写完的示例代码 return bookList; } }
现在想把这些Book对象的多个属性显示在ListView控件里,该怎么做?
解决方案(WinForms场景,最常用的情况)
嘿,这个需求很常见,咱们一步步来实现:
第一步:把ListView配置成多列展示模式
ListView默认不是多列布局,首先要把它的View属性设置为Details,然后添加对应Book属性的列头:
// 假设你的ListView控件名叫listViewBooks listViewBooks.View = View.Details; // 添加三个列,分别对应书名、作者、出版年份 listViewBooks.Columns.Add("书名", 220); // 第二个参数是列宽,可按需调整 listViewBooks.Columns.Add("作者", 180); listViewBooks.Columns.Add("出版年份", 100); // 可选:让列自动适应内容宽度,把宽度设为-2即可 // listViewBooks.Columns[0].Width = -2;
第二步:将Book列表数据映射到ListView中
接下来获取Book列表,遍历每个对象,创建ListViewItem并把属性值对应到列中:
// 获取所有Book数据 var bookList = Book.GetList(); // 先清空ListView里的旧数据(避免重复展示) listViewBooks.Items.Clear(); foreach (var book in bookList) { // 创建一个ListViewItem,第一个参数对应第一列(书名) var listItem = new ListViewItem(book.Title); // 添加子项,对应剩下的两列(作者、年份) listItem.SubItems.Add(book.Author); listItem.SubItems.Add(book.Year); // 把这个项加到ListView里 listViewBooks.Items.Add(listItem); }
进阶:用BindingSource管理数据源(支持动态更新)
如果之后你的Book列表可能会动态变化(比如新增、删除书籍),可以用BindingSource作为中间层来管理数据源,后续更新数据时会更方便:
// 创建BindingSource并绑定Book列表 var bookBindingSource = new BindingSource(); bookBindingSource.DataSource = Book.GetList(); // 绑定到ListView的逻辑和之前一致 listViewBooks.Items.Clear(); foreach (Book book in bookBindingSource) { var listItem = new ListViewItem(book.Title); listItem.SubItems.Add(book.Author); listItem.SubItems.Add(book.Year); listViewBooks.Items.Add(listItem); } // 之后如果数据源变化了,调用这句刷新绑定 // bookBindingSource.ResetBindings(false); // 然后重新执行一遍上面的遍历绑定逻辑(建议封装成单独方法)
小提示
- 一定要确保ListView的
View是Details,不然列和子项都不会显示出来! - 如果是WPF环境的ListView,实现方式会不一样(通常用GridView结合数据绑定),要是你需要WPF的方案,随时说哈~
内容的提问来源于stack exchange,提问作者blue piranha
相关产品推荐
相关产品推荐

