在详细ListView中管理ListView项目的最佳方法?

时间:2009-11-16 16:04:34

标签: c# winforms listview listviewitem

我已经采用以下模式将ListViewItems放在具有多列的ListView中(当我想显示有关MyObject类型列表的信息时),我只是很想知道这是否是完成此任务的最佳方式,或者是否有更高效和可读的代码:

  1. 创建一个继承的ListViewItem类,它在构造函数中使用MyObject对象 - 我将调用此MyObjectListViewItem - 以及一个清除和重新填充的Refresh()方法ListViewItem子项。
  2. 使用我的新MyObjectListViewItem项填充ListView。
  3. 示例:

    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...
    }
    

    连连呢?更好的方式?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-1)

使ListViewItems知道如何构建自己是一个好主意。

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

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

Simple ObjectListView in action

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