在设计器中打开用户控件时Visual Studio中的错误

时间:2009-10-14 15:25:00

标签: c# visual-studio-2008 visual-studio-designer

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

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

如何防止这种情况发生?

我只想明确一点:代码在运行时运行良好。一切都按照设计。只有在Visual Studio的Designer视图中(如果重要的话,2008 SP1)才会出现问题。但是在Designer中它很糟糕,尤其是当应用程序在连接失败时尝试重新连接时。每次进入Designer模式时,我的Visual Studio会冻结约20秒(重新连接超时),这会导致我的工作流程中断。

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

我通过在我的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;
        }