当使用 .net Winform 设计器时,如何处理 UserControl 构造函数中的异常?

3
当您在WinForm设计器中加载UserControl时,VisualStudio会执行控件的InitializeComponent()方法,但不执行其构造函数。这真的很重要,因为构造函数中经常有一些无法在设计时运行的代码。
不幸的是,当您将UserControl添加到另一个控件中时,VisualStudio会运行父控件的InitializeComponent()方法,调用子控件的构造函数,如果子控件的构造函数出现异常,您就会陷入困境。
如何解决这个问题呢?

Visual Studio如何在不构造实例的情况下调用InitialiseComponent。构造函数保证在调用InitialiseComponent之前被调用。 - Ray Booysen
只需尝试创建一个空白窗体,并在构造函数的第一行(即在调用Initializecomponent之前)添加“throw new Exception()”。你会发现,Windows窗体设计器仍然可以加载该窗体。 - Brann
4个回答

2

将仅运行时部分包装起来:

If Not me.DesignMode Then
  'Runtime only here
End If

注意:DesignMode在子控件中无法正常工作。http://www.dotnetjunkies.com/WebLog/mjordan/archive/2003/12/01/4117.aspx - Robert Venables
此外,当您开始调试程序时,似乎“!this.DesignMode”部分内的代码会在程序中执行(如预期),但也会在设计器中执行! - Brann

1
我在CodeProject找到了解决方案,对我很有效:
if (System.ComponentModel.LicenseManager.UsageMode != 
    System.ComponentModel.LicenseUsageMode.Designtime)
{
    // Runtime only here
}

0
我使用的解决方法是将我的运行时初始化代码放入一个InitializeRuntime()方法中,然后从顶层构造函数进行递归调用。这样可以解决问题,但我必须记得为每个添加的用户控件添加InitializeRuntime()方法的调用,而不能只使用设计器拖放组件。

0
为什么在这种情况下不使用OnLoadEvent?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接