C# 如何使用预定义的数据源创建一个对设计器友好的派生组合框?

C# 如何使用预定义的数据源创建一个对设计器友好的派生组合框?,c#,winforms,combobox,datasource,designer,C#,Winforms,Combobox,Datasource,Designer,我想从System.Windows.Forms.ComboBox创建一个派生控件,该控件绑定到从数据库检索的对象列表。其想法是,其他开发人员可以在表单上删除此控件,而不必担心数据源和绑定,除非他们愿意 我尝试扩展combobox,然后在构造函数中设置DataSource、DisplayMember和ValueMember public class CustomComboBox : ComboBox { public CustomComboBox() { this

我想从System.Windows.Forms.ComboBox创建一个派生控件,该控件绑定到从数据库检索的对象列表。其想法是,其他开发人员可以在表单上删除此控件,而不必担心数据源和绑定,除非他们愿意

我尝试扩展combobox,然后在构造函数中设置DataSource、DisplayMember和ValueMember

public class CustomComboBox : ComboBox
{
    public CustomComboBox() 
    {
        this.DataSource = MyDAL.GetItems(); // Returns List<MyItem>
        this.DisplayMember = "Name";
        this.ValueMember = "ItemID";
    }
}
公共类CustomComboBox:ComboBox
{
公共CustomComboBox()
{
this.DataSource=MyDAL.GetItems();//返回列表
this.DisplayMember=“Name”;
this.ValueMember=“ItemID”;
}
}
当我运行时工作,但一旦添加到任何表单中,就会在VisualStudio中抛出许多错误。我得到的错误是:

属性“Items”的代码生成失败。错误为:“对象引用未设置为对象的实例”


正确的方法是什么(C#,Winforms,.NET2.0+)

问题在于,设计器实际上在与正常运行程序略有不同的上下文中进行编译和执行

在构造函数中,您可以将代码包装为:

if (!DesignMode)
{
  //Do this stuff
}

这将告诉设计人员在设计过程中不要运行任何初始化代码。

我在这里的常见评论-设计模式在任何情况下都不可靠,除非控件直接放置在设计图面上-即,如果控件放置在另一个控件上,则即使处于设计模式,设计模式也不正确。我没有找到可靠的方法来判断您是否处于设计模式,尤其是对于继承控件。如果控件继承自非可视控件(例如公共对话框),则即使使用站点的变体也不可靠


请参阅(请确保阅读最后一条注释)。

DesignMode属性在构造函数中不起作用。从谷歌搜索了一段时间,发现了这个LicenseManager的东西

if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
{
    // Do your database/IO/remote call
}
然而,LicenseManager只在构造函数中工作。对于EventHandler,请使用设计模式

资料来源:


另一个参考资料:

这有点奇怪,但我确实学到了一些东西。所以,我称之为胜利。