【问题标题】:Custom Generic UserControl doesn't appear in Toolbox自定义通用用户控件未出现在工具箱中
【发布时间】:2020-01-03 17:56:22
【问题描述】:

我需要使用泛型创建自定义用户控件,因为我有一个 BindingSourceT 类型的数据源

public partial class ABMControl<T> : UserControl
{
    public ABMControl()
    {
        InitializeComponent();
        this.bindingSource.Datasource = typeof(T);
    }
}

在表单设计器中,自定义用户控件不会出现在工具箱中,因为它是通用的。 解决办法是什么?

【问题讨论】:

  • 从工具箱中删除控件时,您是在命令设计者创建该控件的实例。您不能创建GenericControl&lt;T&gt; 的实例。相反,您需要一个GenericControl&lt;SomeClass&gt; 的实例。因此,为什么通用控件没有出现在工具箱中是完全有道理的,因为它在设计器中没有用处。
  • 同样从 VS2015.1 开始,设计器展示了具有通用基类的类,没有任何问题。因此,较新版本的 VS 不再需要第一条评论中链接的解决方法。

标签: c# winforms generics user-controls windows-forms-designer


【解决方案1】:

这是工具箱的预期行为。

当将控件从工具箱拖放到窗体上时,您是在命令设计者创建该控件的实例。在没有确定T 的情况下,您无法创建GenericControl&lt;T&gt; 的实例。相反,您需要一个GenericControl&lt;SomeClass&gt; 的实例。

所以泛型控件没有出现在工具箱中是完全有道理的,因为它在设计器中没有任何用途,并且设计器在创建实例时不知道它应该为泛型参数使用什么类型。

关于设计器,考虑到这篇文章:Generic Base Class for UserControlVS2015.1 开始,Windows 窗体设计器显示了具有通用基类的类,没有任何问题。以下类将毫无问题地显示在设计器中:

public class SomeClassControl:GenericControl<SomeClass>
{
}

对于旧版本的 Visual Studio,请使用链接帖子中描述的解决方法:

public class SomeClassControl:SomeClassControlBase
{
}
public class SomeClassControlBase:GenericControl<SomeClass>{}

【讨论】:

  • 这篇文章能回答你的问题吗? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
相关资源
最近更新 更多