Я пытаюсь улучшить проект Winforms, где данные, хранящиеся в таблице, хранятся в свойстве Tag ListViewItems. Когда datatable реорганизуется в List <T> (или на самом деле классы, содержащие списки), это очень помогло бы, если бы я мог создать свойство Tag generic с помощью подкласса ListView.Generic WinForms ListView (по отношению к тегу)
В лучшем мире я бы хотел, чтобы свойство Tag было заменено публичным тегом T {get; set;}, который обертывает base.Tag и отбрасывает его. Второй лучший вариант - это тег Obsoleting и предоставление нового свойства, такого как TypedTag, работающего, как указано выше.
Я думаю, что это связано с подклассом или составной агрегацией, по меньшей мере, ListView, ListViewItemCollection, SelectedListViewItemCollection и ListViewItem, и я не уверен, как это сделать.
Короче:
ListView<Employee> lvwEmployees;
должно привести это быть возможным:
Employee selected = lvwEmployees.SelectedItems[0].TypedTag;
И дать ошибку компиляции для этого:
DataRow selected = lvwEmployees.SelectedItems[0].TypedTag;
возможно ли это? Это уже сделано? Проект - это dotnet 2.0, но я думаю, что попробую его обновить, если это поможет.
EDIT: Оказывается, что аргумент конструктора владельца - это все, что определенная коллекция должна подключаться к внутренней коллекции. Следовательно, следующие работы:
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 в форме.
Самый простой способ добавить один из этих списков - это добавить обычный список в форму и затем изменить его тип в исходных файлах. (И если вы не знаете, где это объявлено или инстанцируется, найдите или используйте обычный список.)
Обсудить подобную тему на http://stackoverflow.com/questions/1126404/is-there-an-easy-way-to-associate-an-event-with-a-listviewitem – stuartd