1

背景:我创建了这个 UserControl。在用户控件的构造函数中,我调用了一个从数据库中检索一些值的函数。如果在检索值时发生错误,则会显示一个解释错误的消息框。到现在为止还挺好。

问题: 我创建了一个包含我的 UserControl 的表单(在其他元素中)。现在,当我打开此表单(甚至是 UserControl 本身)时,将调用构造函数(我想这样可以准确地绘制它),并且由于数据库不可用,因此会显示消息框(上面已解释)。

我该如何防止这种情况发生?

我只想说清楚:代码在运行时运行良好。一切都按照设计。仅在 Visual Studio 的设计器视图(如果重要,则为 2008 SP1)中出现问题。但是在 Designer 中这很糟糕,尤其是现在当连接失败时应用程序尝试重新连接时。每次我进入设计器模式时,我的 Visual Studio 都会冻结大约 20 秒(重新连接超时),它正在扼杀我的工作进程。

4

2 回答 2

4

您可以检查您的控件是否以设计模式显示:

http://msdn.microsoft.com/en-us/library/system.componentmodel.component.designmode.aspx

/编辑:正如人们在对另一个答案的评论中指出的那样, DesignMode 属性在构造函数中不可用。因此,最好的解决方案可能是将数据库内容移动到像“Load”这样的事件中,并在那里使用 DesignMode 属性。

于 2009-10-14T15:30:01.513 回答
3

我通过在名为 IsRunning 的 Program 类上拥有一个全局静态属性来解决这个问题。

当我的程序在 main 方法中启动时,我将 IsRunning 属性设置为 true。然后在我的用户控件的构造函数中,我可以轮询属性 IsRunning 以确定我是否执行特定代码,在您的情况下,代码将尝试访问数据库......

编辑:这是一些代码......

private static bool _running = false;

    /// <summary>
    /// Gets or sets a value indicating whether this <see cref="Program"/> is running.
    /// This property is used for design time WSOD issues and is used instead of the 
    /// DesignMode property of a control as the DesignMode property has been said to be
    /// unreliable.
    /// </summary>
    /// <value><c>true</c> if running; otherwise, <c>false</c>.</value>
    public static bool Running
    {
        get
        {
            return _running;
        }
    }


    static void Main(string[] args)
    {
        Initialize();


        _running = true;

……

在我的用户控制...

    public AssignmentList()
    {
        InitializeComponent();

        if (!Program.Running)
        {
            return;
        }
于 2009-10-14T15:29:44.993 回答