【问题标题】:Best way to manage ListViewItems in a Detailed ListView?在详细 ListView 中管理 ListView 项的最佳方法?
【发布时间】:2009-11-16 16:04:34
【问题描述】:

我采用了以下模式将 ListViewItems 放入具有多列的 ListView 中(当我想显示有关 MyObject 类型列表的信息时),我只是好奇看看这是否是完成这项任务的最佳方式,或者代码中是否有更高效和可读的方法:

  1. 创建一个继承的 ListViewItem 类,该类在构造函数中采用 MyObject 对象 - 我将称之为 MyObjectListViewItem - 和一个用于清除和重新填充 ListViewItem 子项的 Refresh() 方法。
  2. 用我的新 MyObjectListViewItem 项填充 ListView。

示例:

public MyObject MyObject { get; set; }
public MyObjectListViewItem(MyObject myObj)
{
    MyObject = myObj;
    this.Refresh();
}

public void Refresh()
{
    this.SubItems.Clear();
    this.Text = myObj.FirstColumnProperty;
    this.SubItems.Add(myObj.SecondColumnProperty); // etc...
}

建议?更好的方法?

【问题讨论】:

    标签: c# winforms listview listviewitem


    【解决方案1】:

    您是否考虑过使用BindingSource,或者创建自己的实现IBindingListView 的方法?这使得对数据及其状态的关注仅限于数据本身,而不是任何使用它的控件。由于 .NET 控件已经构建为与 BindingSource 一起使用,因此您可以利用一些更强大的功能。控件不是显式调用屏幕刷新,而是简单地负责响应绑定源引发的事件,以及通知控件是否已准备好刷新而不强制刷新的控制器。

    【讨论】:

    • 这行不通。 WinForms下的ListViews不支持BindingSources。
    • 唉 Forms.ListView 不支持 BindingSources。考虑使用连接到绑定源的 DataGridView。每当从绑定源中添加或删除元素时,datagridview 都会自动更新
    【解决方案2】:

    制作知道如何构建自己的 ListViewItem 是个好主意。

    如果你稍微扩展一下这个想法,你就可以让列知道如何构建每个子项,这也使它们能够自动对 ListView 进行排序,支持分组和复制/拖放行。这只是ObjectListView 为您做的一些事情。

    ObjectListView 是一个围绕 .NET WinForms ListView 控件的开源包装器,它使 ListView 更易于使用,并添加了一些非常好的新功能并解决了一些烦人的错误/限制。

    如果您确实喜欢@Rex 使用BindingSource 的想法,ObjectListView 项目还提供了一个可数据绑定的数据感知DataListView

    【讨论】:

    • 为什么要否决这个答案?该问题要求提供有关更好方法的想法和建议。这就是这个答案给出的。
    猜你喜欢
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多