背景: 我创建了这个UserControl。在用户控件的构造函数中,我调用一个从数据库中检索一些值的函数。如果在检索值时发生错误,则会显示解释错误的消息框。到目前为止一切都很好。
问题: 我创建了一个表单(包括其他元素)包括我的UserControl。现在,当我打开这个表单(甚至是UserControl本身)时,会调用构造函数(我想它可以准确地绘制),并且由于数据库不可用,所以会显示消息框(如上所述)。
如何防止这种情况发生?
我只想明确一点:代码在运行时运行良好。一切都按照设计。只有在Visual Studio的Designer视图中(如果重要的话,2008 SP1)才会出现问题。但是在Designer中它很糟糕,尤其是当应用程序在连接失败时尝试重新连接时。每次进入Designer模式时,我的Visual Studio会冻结约20秒(重新连接超时),这会导致我的工作流程中断。
答案 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;
}