【问题标题】:How do you deal with exceptions in UserControls constructors when using the .net Winform Designer?使用 .net Winform Designer 时如何处理 UserControls 构造函数中的异常?
【发布时间】:2009-01-26 15:55:24
【问题描述】:

当您在 WinForm 设计器中加载 UserControl 时,VisualStudio 执行控件的 InitializeComponent() 方法,但不执行其构造函数。 这真的很重要,因为在构造函数中有一些无法在设计时运行的代码是很常见的。

不幸的是,当您将 UserControl 添加到另一个控件时,VisualStudio 会运行​​父控件的 InitializeComponent() 方法,该方法调用子控件的构造函数,如果您在这些构造函数中遇到异常,那么您就是卡住了。

你如何处理这个问题?

【问题讨论】:

  • Visual Studio 如何在不构造实例的情况下调用 InitialiseComponent。构造函数保证在 InitialiseComponent 之前被调用。
  • 试试吧:创建一个空白表单,并在构造函数的第一行(即调用 Initializecomponent 之前)添加“throw new Exception()”。您会看到 winform 设计器仍然可以加载表单。

标签: .net visual-studio winforms windows-forms-designer


【解决方案1】:

仅使用以下代码包装运行时部分:

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

【讨论】:

【解决方案2】:

我找到了适合我的a solution in CodeProject

if (System.ComponentModel.LicenseManager.UsageMode != 
    System.ComponentModel.LicenseUsageMode.Designtime)
{
    // Runtime only here
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我正在使用的解决方法是将我的运行时初始化代码放在一个 InitializeRuntime() 方法中,我从顶层构造函数递归调用该方法。 这解决了问题,但我始终必须记住为我添加的每个 UserControl 添加对 InitializeRuntime() 的调用,而不是使用设计器拖放组件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-08
        • 2011-04-08
        相关资源
        最近更新 更多