C# 在设计器中打开UserControl时VisualStudio中出错
背景: 我已经创建了这个用户控件。在用户控件的构造函数中,我调用了一个函数,该函数从数据库中检索一些值。如果在检索值时发生错误,将显示一个解释错误的消息框。到目前为止还不错 问题: 我创建了一个表单,其中包括我的UserControl。现在,当我打开这个表单(甚至UserControl本身)时,会调用构造函数(我认为这样可以准确地绘制它),并且,由于数据库不可用,因此会显示messagebox(如上所述) 如何防止这种情况发生C# 在设计器中打开UserControl时VisualStudio中出错,c#,visual-studio-2008,visual-studio-designer,C#,Visual Studio 2008,Visual Studio Designer,背景: 我已经创建了这个用户控件。在用户控件的构造函数中,我调用了一个函数,该函数从数据库中检索一些值。如果在检索值时发生错误,将显示一个解释错误的消息框。到目前为止还不错 问题: 我创建了一个表单,其中包括我的UserControl。现在,当我打开这个表单(甚至UserControl本身)时,会调用构造函数(我认为这样可以准确地绘制它),并且,由于数据库不可用,因此会显示messagebox(如上所述) 如何防止这种情况发生 我只想说清楚:代码在运行时非常有效。一切都按计划进行。只有在Visu
我只想说清楚:代码在运行时非常有效。一切都按计划进行。只有在VisualStudio的Designer视图(如果有必要的话,2008 SP1)中才会出现问题。然而,在Designer中,这很糟糕,尤其是现在当连接失败时应用程序试图重新连接时。每次我进入设计器模式时,我的Visual Studio都会冻结大约20秒(重新连接超时),这会扼杀我的工作进程。我通过在程序类上使用名为IsRunning的全局静态属性来解决这个问题 当我的程序在main方法中启动时,我将IsRunning属性设置为true。然后在我的用户控件的构造函数中,我可以轮询正在运行的属性,以确定我是否执行特定的代码,在您的情况下,这些代码将尝试访问数据库 编辑: 这里有一些代码
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;
我通过在我的程序类上有一个名为IsRunning的全局静态属性来解决这个问题 当我的程序在main方法中启动时,我将IsRunning属性设置为true。然后在我的用户控件的构造函数中,我可以轮询正在运行的属性,以确定我是否执行特定的代码,在您的情况下,这些代码将尝试访问数据库 编辑: 这里有一些代码
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;
您可以检查控件是否以设计模式显示:
/编辑:正如人们在对另一个答案的评论中指出的,DesignMode属性在构造函数中不可用。因此,最好的解决方案可能是将数据库内容移动到类似“Load”的事件中,并在其中使用DesignMode属性。您可以检查控件是否以设计模式显示:
/编辑:正如人们在对另一个答案的评论中指出的,DesignMode属性在构造函数中不可用。因此,最好的解决方案可能是将数据库内容移动到类似“Load”的事件中,并在其中使用DesignMode属性。您为什么不使用“DesignMode”属性?相反,处理Load事件,将代码移动到其中并检查DesignMode属性。比紧密耦合的全局变量更好的解决方案。我已经有一段时间没有考虑这个问题了,但是我觉得设计模式有点奇怪,所以我只想用一种简单(没有魔力)的方法来控制自己。我不是100%,但我认为直到构造函数激发之后,才在控件上设置DesignMode属性。DesignMode属性并不不可靠。。。你不能在构造函数中检查它。想想看:VS设计器将实例化您的表单类,然后在下一行代码中,它将设置DesignMode=true。回顾我是如何使用上述方法的,这无疑是一个错误,因为当时我没有考虑为什么它会这样工作。感谢您为我澄清。您为什么不使用“DesignMode”属性?请处理加载事件,将代码移到其中,然后检查DesignMode属性。比紧密耦合的全局变量更好的解决方案。我已经有一段时间没有考虑这个问题了,但是我觉得设计模式有点奇怪,所以我只想用一种简单(没有魔力)的方法来控制自己。我不是100%,但我认为直到构造函数激发之后,才在控件上设置DesignMode属性。DesignMode属性并不不可靠。。。你不能在构造函数中检查它。想想看:VS设计器将实例化您的表单类,然后在下一行代码中,它将设置DesignMode=true。回顾我是如何使用上述方法的,这无疑是一个错误,因为当时我没有考虑为什么它会这样工作。谢谢你让我直截了当。我同意这将是一个比全局变量更一般的解决方案,但我仍然接受wilpeck的答案,因为它对我的情况更有帮助。我在一个单独的类中有所有错误报告的内容,现在我只检查该类中的全局变量,而不是在每个控件中进行检查。我同意这将是一个比全局变量更通用的解决方案,但是我仍然接受wilpeck的答案,因为它对我的情况更有用。我在一个单独的类中有所有错误报告的内容,现在我只检查该类中的全局变量,而不是在每个控件中进行检查。