【问题标题】:Errors in VisualStudio when opening UserControl in designer在设计器中打开用户控件时 Visual Studio 中的错误
【发布时间】:2009-10-14 15:24:59
【问题描述】:

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

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

如何防止这种情况发生?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

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

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

    【讨论】:

    • 您为什么不使用“DesignMode”属性?
    • 不是这个,而是处理 Load 事件,将代码移入其中并检查 DesignMode 属性。比一些紧密耦合的全局变量更好的解决方案。
    • 我已经有一段时间没有考虑这个问题了,但是我认为 DesignMode 有一些奇怪的地方,所以我只是想用一种简单(没有魔法)的方法来控制自己。我不是 100%,但我认为直到构造函数触发之后,您的控件上才会真正设置 DesignMode 属性。
    • DesignMode 属性不是不可靠的......你只是不能在构造函数中检查它。想一想:VS 设计器将实例化您的表单类,然后可能在下一行代码中设置 DesignMode=true。
    • 是的,我听到了,这是有道理的。回顾我是如何使用上述方法的,这简直是一个骇客,因为当时我没有考虑为什么它会以这种方式工作。谢谢你让我直截了当。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多