我正在尝试改进 Winforms 项目,其中数据表行存储在 ListViewItems 的 Tag 属性中。当数据表被重构为 List<T>(或者实际上是包含列表的类)时,如果我可以通过使用 ListView 的子类来使 Tag 属性通用,那将非常有帮助。
在最好的情况下,我希望将 Tag 属性替换为公共 T Tag{get; set;} 包装 base.Tag 并强制转换它。第二个最好的方法是废弃标签并提供像上面一样工作的 TypedTag 之类的新属性。
我认为这将涉及至少 ListView、ListViewItemCollection、SelectedListViewItemCollection 和 ListViewItem 的子类化或复合聚合,我不知道该怎么做。
简而言之:
ListView<Employee> lvwEmployees;
应该导致这成为可能:
Employee selected = lvwEmployees.SelectedItems[0].TypedTag;
并为此给出编译错误:
DataRow selected = lvwEmployees.SelectedItems[0].TypedTag;
是否可以?它已经完成了吗?项目是 dotnet 2.0,但我想如果它有助于解决这个问题,我会尝试升级它。
编辑:事实证明,所有者构造函数参数是某个集合需要连接到内部集合的所有内容。因此,以下工作:
ListView a = new ListView();
a.Items.Add("Hello");
Assert.AreEqual(1, new ListView.ListViewItemCollection(a).Count);
这使得创建通用标记 ListView 变得相当容易。稍后我将发布完整的解决方案。:)
EDIT2:这是解决方案: http: //thecarlr.blogspot.com/2010/11/generic-listview.html
EDIT3:对于设计器支持,只需添加一个非通用子类并使用它。示例:如果您打算在表单中使用 ListView<Employee>,请在另一个文件中创建一个 ListViewEmployee : ListView<Employee>,然后在表单中使用 ListViewEmployee。
添加这些列表视图之一的最简单方法是将普通列表视图添加到表单中,然后在源文件中更改它的类型。(如果您不知道它在哪里声明或实例化,请找出或使用普通的列表视图。)