3

我想从 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+)?

4

3 回答 3

6

问题是设计者实际上在与正常运行程序略有不同的上下文中进行了一些编译和执行。

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

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

这将告诉设计者在设计时不要运行任何初始化代码。

于 2009-01-16T17:11:19.140 回答
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

于 2009-01-20T16:24:35.763 回答
0

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

请参阅http://keyofdflat.livejournal.com/5407.html(请务必阅读最后一条评论)。

于 2009-01-16T17:43:22.537 回答