在设计器中打开UserControl时VisualStudio中的错误

问题描述:

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

问题: 我创建了一个窗体(其中包括其他元素)包括我的UserControl。现在,当我打开这个表单(或者甚至UserControl本身)时,构造函数被调用(我想这样可以准确地绘制它),并且由于数据库不可用,所以会显示messagebox(如上所述)。

如何防止这种情况发生?

我只想清楚一点:代码在运行时很好用。一切都按设计。只有在Visual Studio(2008 SP1)的Designer视图中才会出现问题。然而,在Designer中它是非常糟糕的,特别是当应用程序在连接失败时尝试重新连接时。每次进入Designer模式时,我的Visual Studio冻结约20秒(重新连接超时),并且它正在终止我的工作过程。

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

当我的程序在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; 
     } 
+1

你为什么不使用“DesignMode”属性的任何原因? – pat 2009-10-14 15:40:32

+0

取而代之,处理Load事件,将代码移入它并检查DesignMode属性。比一些紧密耦合的全局变量更好的解决方案。 – 2009-10-14 15:44:36

+0

自从我考虑过这一点以来已经有一段时间了,但是我认为DesignMode有一些不好的地方,所以我只想用一种简单的(没有魔法)的方法来控制自己。我不是100%,但我不认为DesignMode属性实际上是在构造函数触发之前在您的控件上设置的。 – 2009-10-14 15:47:22

你可以检查您是否控制显示在设计模式:

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

/编辑:随着人们在评论另一个答案指出,该DesignMode属性是不是在构造函数中使用。所以最好的解决方案可能是将数据库的东西移动到像“Load”这样的事件中,并在那里使用DesignMode属性。

+0

+1,这是一个比全局变量更好的解决方案。 – 2009-10-14 15:52:32

+0

我同意这将是一个比全局变量更通用的解决方案,但是我仍然接受wilpeck的答案,因为它对我的情况更有帮助。我在一个单独的类中拥有所有错误报告的东西,现在我只检查该类中的全局变量,而不是在每个控件中执行它。 – 2009-10-18 07:46:45