我想从System.Windows.Forms.ComboBox创建一个派生控件,该控件绑定到我从数据库中检索的对象列表。想法是其他开发人员可以将这个控件放在他们的表单上,而不必担心数据源,绑定,除非他们想要。
我尝试扩展组合框,然后在构造函数中设置DataSource,DisplayMember和ValueMember。
public class CustomComboBox : ComboBox
{
public CustomComboBox()
{
this.DataSource = MyDAL.GetItems(); // Returns List<MyItem>
this.DisplayMember = "Name";
this.ValueMember = "ItemID";
}
}
我运行时工作,但一旦将它添加到任何表单,就会在Visual Studio中引发很多错误。我得到的错误是:
“属性'代码生成'项目失败。错误是:'对象引用未设置为对象的实例”
实现这一目标的正确方法是什么(C#,Winforms,.NET 2.0+)?
答案 0 :(得分:6)
问题在于设计者实际上在一些与正常运行程序不同的上下文中进行了一些编译和执行。
在构造函数中,您可以将代码包装在:
中if (!DesignMode)
{
//Do this stuff
}
这将告诉设计人员在设计时不运行任何初始化代码。
答案 1 :(得分:2)
DesignMode属性在构造函数中不起作用。从谷歌上搜索一下,找到了这个LicenseManager的东西。
if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
{
// Do your database/IO/remote call
}
但是,LicenseManager仅适用于构造函数。对于事件处理程序,请使用DesignMode。
来源:http://dotnetfacts.blogspot.com/2009/01/identifying-run-time-and-design-mode.html
另一个参考:http://weblogs.asp.net/fmarguerie/archive/2005/03/23/395658.aspx
答案 2 :(得分:0)
我在这里的常用评论 - 除了将控件直接放置在设计图面上之外,DesignMode在任何情况下都不可靠 - 即如果控件放在另一个控件上,即使您处于设计模式,DesignMode也不成立。我发现没有可靠的方法来判断你是否处于设计模式 - 特别是对于继承的控件。如果控件继承自非可视控件(例如,通用对话框),即使使用Site的变体也不可靠。
请参阅http://keyofdflat.livejournal.com/5407.html(请务必阅读上一条评论)。