Универсальный WinForms ListView (в связи с тегом) - PullRequest
0 голосов
/ 17 ноября 2010

Я пытаюсь улучшить проект Winforms, где строки с данными можно хранить в свойстве Tag ListViewItems. Когда для таблицы данных делается рефакторинг для List (или фактически для классов, содержащих списки), было бы очень полезно, если бы я мог сделать свойство Tag универсальным, используя подкласс ListView.

В лучшем из миров, я бы хотел, чтобы свойство Tag было заменено общедоступным T Tag {get; set;}, который оборачивает 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 в форме, создайте ListViewEmployee: ListView в другом файле и используйте ListViewEmployee в форме.

Самый простой способ добавить один из этих списков - добавить в форму обычный список и затем изменить его тип в исходных файлах. (И если вы не знаете, где он объявлен или создан, вместо этого выясните или используйте обычный просмотр списка.)

Ответы [ 3 ]

1 голос
/ 17 ноября 2010

Вы сделали неправильный класс родовым. SelectedItems [0] является ListViewItem, а не ListView.

Вы ничего не можете сделать, чтобы изменить тип свойств Items и SelectedItems. Конечно, вы можете получить свой собственный класс из ListViewItem и просто добавить свойство, которое хотите сохранить. Нет необходимости в другом свойстве Tag. У вас не возникнет проблем с их добавлением, но вам нужно будет привести их к производному классу при извлечении их из коллекции Selected / Items.

В общем, избегайте такого рода кода, используя ListView только как представление вашей модели. После этого ListViewItem.Index всегда должен быть полезен для получения типобезопасной ссылки от вашей модели.

0 голосов
/ 18 ноября 2010

VS Designer просто не может обрабатывать абстрактные или общие элементы управления ( не из-за отсутствия запроса ).

Одним из способов обойти это ограничение является написание безопасной оболочки типа вокруг стандартного ListView.

Примерно так:

public class TypedListView<T> where T : class
{
    public TypedObjectListView(ListView lv) {
        this.lv = lv;
    }
    private ListView lv;

    public virtual T SelectedObject {
        get { return (T)this.lv.SelectedItems[0].Tag; }
    }

    // Lots more methods/properties
}

Вы создаете обычный ListView в Designer, а затем, когда вы хотите получить к нему доступ, вместо этого вы создаете и используете свой адаптер.Например:

var typedListView = new TypedListView<Employee>(this.listView1);
Employee selectedEmployee = typedListView.SelectedObject;

Вам потребуется предоставить типизированную версию каждого ListView свойства или метода, который вы хотите использовать.

Проект ObjectListView принимает этоподход к созданию TypedObjectListView, который делает именно то, что вы просите.

0 голосов
/ 18 ноября 2010

Вот решение: http://thecarlr.blogspot.com/2010/11/generic-listview.html

Наслаждайтесь:)

/ Карл

...