我正試圖改進Winforms項目,其中數據錶行存儲在ListViewItems的Tag屬性中。當數據表被重構爲List <T>(或者實際上包含列表的類)時,如果我可以通過使用ListView的子類來使Tag屬性具有通用性,它將非常有幫助。通用WinForms ListView(與標籤有關)
在最好的世界中,我希望標籤屬性被替換爲公共標籤{get;設置;}包裝base.Tag並施放它。 第二好的應該是Obsoleting 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。
添加其中一個listviews的最簡單方法是將正常的listview添加到窗體,然後在源文件中更改它的類型。 (如果你不知道它在哪裏聲明或實例化,請改爲查找或使用正常的listview。)
有一個類似的話題討論http://stackoverflow.com/questions/1126404/is-there-an-easy-way-to-associate-an-event-with-a-listviewitem – stuartd 2010-11-17 17:32:27