Универсальный элемент управления ListView - PullRequest
2 голосов
/ 03 августа 2009

Я использую Generics с элементом управления ListView, чье первоначальное определение класса выглядит следующим образом:

namespace BaseControlLibrary
{
    public partial class CustomListView<T> : System.Windows.Forms.ListView
    {
        // Custom fields, properties, methods go here

        public CustomListView(List<T> data)
        {
            _columnInfo = new Dictionary<int, string>();
            _columnIndex = 0;

            _lvwItemComparer = new ListViewItemComparer();
            this.ListViewItemSorter = _lvwItemComparer;

            InitializeColumnNames();
            BindDataToListView(data);

            this.Invalidate();
        }
    }
}

Вот мой дизайнерский файл:

partial class CustomListView
{
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    //protected override void Dispose(bool disposing)
    //{
    //    if (disposing && (components != null))
    //    {
    //        components.Dispose();
    //    }
    //    base.Dispose(disposing);
    //}

    #region Component Designer generated code

    /// <summary>
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        components = new System.ComponentModel.Container();
        // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    }

    #endregion
}

Я хочу создать библиотеку управления Windows, и я успешно это сделал, но проблема возникает, когда я не могу добавить DLL в панель инструментов. Я не совсем уверен, почему я не могу этого сделать. Я думал, что все элементы управления Windows Forms реализуют интерфейс IComponent, который является требованием для добавления элементов в панель инструментов. Это потому, что в определении класса есть параметр типа?

Ответы [ 3 ]

3 голосов
/ 03 августа 2009

Дизайнер ненавидит:

  • дженериков
  • вещей с abstract базовых классов

Даже если это работает во время выполнения, вы, вероятно, не сможете заставить его работать в IDE. Сожалею. Возможно, рассмотрим неуниверсальный класс со свойством Type; это самое лучшее, что ты сделаешь ...

кстати, CustomListView<T> и CustomListView - это совершенно разные классы. У вас есть 2 класса, а не один.

2 голосов
/ 04 августа 2009

Вы не можете использовать общие элементы управления (т. Е. Элементы управления, специализированные через общие элементы) в конструкторе. [Кажется, я помню, что читал, что это было дизайнерское решение команды VS, но я не могу найти ссылку.]

Для ObjectListView Я использовал шаблон Adapter, чтобы обеспечить типизированный доступ к элементу управления ListView.

public class TypedObjectListView<T> where T : class
{
    /// <summary>
    /// Create a typed wrapper around the given list.
    /// </summary>
    public TypedObjectListView(ObjectListView olv) {
        this.olv = olv;
    }

    public void BindTo(IList<T> objects) {
       // Manipulate the attached ListView here
    }

    // plus whatever other methods you want
}

и вы бы использовали его так:

TypedObjectListView<Person> tlist = 
   new TypedObjectListView<Person>(this.listView1);
tlist.BindTo(myListofPeople);

Или вместо того, чтобы писать все самостоятельно, вы можете просто использовать ObjectListView:)

0 голосов
/ 11 апреля 2012

Можно получить полпути - у меня есть элемент управления HierarchicalDataSource, который определен в универсальном классе, и способ, которым я могу отобразить его в наборе инструментов, заключается в создании конкретной реализации, хотя всего один слой с типами определены. Компиляция проекта в dll, а затем добавление на панель инструментов из этой DLL дает мне элемент панели инструментов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...