我正在使用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窗体控件都实现了IComponent接口,这是将项添加到工具箱的要求。是因为类型参数是类定义的一部分吗?
答案 0 :(得分:3)
设计师讨厌:
abstract
基类即使它在运行时工作,你可能也不会让它在IDE中工作。抱歉。也许考虑具有Type
属性的非泛型类;那就是你要做的最好的事情......
btw,CustomListView<T>
和CustomListView
是完全不同的类。你有两个班,而不是一个。
答案 1 :(得分: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:)
答案 2 :(得分:0)
有可能得到一个中途的房子 - 我有一个在泛型类中定义的HierarchicalDataSource控件,我让它出现在工具箱中的方式是创建一个具体的实现,尽管只是一个带有类型的一个衬里定义。将项目编译为dll,然后从该DLL添加到工具箱,为我提供了工具箱项。