Я использую 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, который является обязательным для добавления элементов в окно инструмента. Не потому ли, что параметр type является частью определения класса?
Дизайнер ненавидит:
abstract
базовыми классамиДаже если он работает во время выполнения, вы, вероятно, не собираетесь его работать в среде IDE. Сожалею. Возможно, рассмотрим не общий класс с свойством Type
; что о лучшем, что вы будете делать...
btw, CustomListView<T>
и CustomListView
являются совершенно разными классами. У вас есть 2 класса, а не один.
В дизайнере нельзя использовать общие элементы управления (т.е. специализированные, специализированные с помощью дженериков). [Кажется, я помню, что это было конструктивное решение команды VS, но я не могу найти ссылку.]
Для ObjectListView Я использовал шаблон адаптера, чтобы обеспечить типизированный доступ к элементу управления 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:)
Можно получить половину дома - у меня есть элемент управления HierarchicalDataSource, который определен в родовом классе, и способ, которым я получаю его, чтобы появиться в панели инструментов, - это создание конкретной реализации, хотя и только один лайнер с типами определены. Компиляция проекта в dll, а затем добавление в панель инструментов из этой DLL дает мне элемент панели инструментов.