在 C# 中编写表单时无法查看设计器

Can't view designer when coding a form in C#

我正在关注 this winforms 教程,到目前为止,教程是在不使用工具箱的情况下对表单进行编码。相信很快就会对工具箱进行更深入的介绍。

按照教程,我在以下两段代码中做了部分class:

第一个文件:

using System;
using System.Windows.Forms;

public class Numeric : System.Windows.Forms.TextBox
{
    public Numeric()
    {
    }
}

public partial class Exercise
{
    private Numeric txtbox;
    System.ComponentModel.Container components;
}

第二个文件:

using System;
using System.Windows.Forms;

public partial class Exercise : Form
{
    private void InitializeComponent()
    {
        txtbox = new Numeric();
        Controls.Add(txtbox);
    }

    public Exercise()
    {
        InitializeComponent();
    }
}

public class program
{
    public static int Main()
    {
        Application.Run(new Exercise());
        return 0;
    }
}

当我 运行 使用 F5 编写代码时,一切看起来都很好:弹出带有文本框的表单。

但由于某些原因,当我右键单击第二个文件并选择 "View Designer" 时,我收到一条错误消息 "The variable 'txtbox' is either undeclared or was never assigned"。我可以选择 "Ignore and Continue",这会引导我进入一个没有文本框的表单。

为什么会出现这种情况?我知道你们中的一些人认为我应该只使用工具箱,这可能是最明智的做法,但我仍然想了解为什么会这样。

控件的声明应该放在Designer.cs文件中,以便Visual Studio可以编译和显示这个单元。

当您启动应用程序时,编译器会考虑您部分的所有部分 class 然后它会找到 txtBox 声明。

尝试在单个文件中仅保留表格 class 及其图形声明。 此单个文件应具有 InitializeComponent() 中初始化的 UI 个组件的 InitializeComponent 方法、构造函数和字段声明。

Windows 表单设计器如何工作?

当您在 windows 表单设计器中打开 Form 时,设计器会查看文件中的第一个 class。如果文件的 Designer.cs 包含 class 的另一部分,也包含它并尝试 反序列化 这些文件内容。在反序列化和加载表单设计时的过程中,它会创建表单的 base class 实例,并在这些文件中查找组件声明和 InitializeComponents 方法。如果找到它们,则使用反序列化代码创建组件并设置它们的属性,并将组件添加到创建的基础 class 实例中。

一些有用的事实:

  • Form 的构造函数中的代码不会在设计时执行,但您的表单的基础 class 的构造函数将在设计时执行。
  • InitializeComponent 中的代码不会在设计时执行,但这些代码将被反序列化并用于创建表单的设计器。
  • 设计者无法显示具有抽象基础的表单 class。 (solution)
  • 设计器无法显示具有通用性的表单 class。比如不能显示MyForm:SomeForm<SomeClass>,但是可以显示SomeForm<T>:Form。 (solution)
  • 如果您为表单定义新的 属性,属性将不会显示在属性 window 中。属性 window,显示基础 class 的属性,但具有您的表单的值。
  • 当一个文件包含 2 个 class 时,如果表单不是第一个 class,设计器将无法加载,您会收到一条警告,指出表单应该是第一个 class在设计器中显示。
  • 以上规则也适用于用户控件。

例子

看看下面的代码,其中有一些严重的问题:

  • class 的构造函数与 class name
  • 不同
  • 语句int i="x";
  • 没有分号,因为这是 C# class
  • InitializeComponent 方法没有在构造函数中调用

但有趣的是您可以在设计器中看到表单,即使存在这些错误!

只需在您的项目中创建一个文件并将以下代码放入文件中并保存文件并关闭它。然后不尝试构建解决方案,在设计器中打开表单。这是代码:

using System
using System.Windows.Forms
namespace SampleApplication
{
    public class MyForm:Form
    {
        public NotMyForm()
        {
        }
        public void InitializeComponent()
        {
            int i="x";
            textBox1 = new TextBox()
            textBox1.Text = "Hi"
            this.Controls.Add(textBox1)
        }
        private TextBox textBox1
    }
}

这里是设计师的截图:

更多信息

要查找更多信息,请查看此 link:

您的问题的解决方案

作为解决方案,您可以移动 private Numeric txtbox; 并将其放在 Exercise class.

中的第二个文件中