我正在关注winforms的this教程,到目前为止,教程正在编写表单而不使用工具箱。我相信它很快就会更深入地介绍工具箱。
在本教程之后,我在以下两段代码中进行了部分分类:
第一个文件:
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”时,我收到一条错误,上面写着“变量'txtbox'未声明或从未分配过”。我可以选择“忽略并继续”,这会将我引导到一个没有文本框的表单。
为什么会这样?我知道有些人认为我应该使用工具箱,这可能是最明智的做法,但我仍然想知道为什么会这样。
答案 0 :(得分:12)
当您在Windows窗体设计器中打开Form
时,设计人员会查看文件中的第一个类。如果文件的Designer.cs
包含该类的其他部分部分,则还包括该文件并尝试反序列化这些文件内容。在反序列化和加载表单设计时的过程中,它会创建表单的基类的实例,并在这些文件中查找组件声明和InitializeComponents
方法。如果找到它们使用反序列化代码创建组件并设置它们的属性,并将组件添加到创建的基类实例中。
一些有用的事实:
Form
的构造函数中的代码不会在设计时执行,但是表单基类的构造函数将在设计时执行。InitializeComponent
中的代码不会在设计时执行,但这些代码将被反序列化,并将用于创建表单的设计者。MyForm:SomeForm<SomeClass>
,但可以显示SomeForm<T>:Form
。 (solution)示例强>
看看下面的代码,它有一些严重的问题:
int i="x";
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
}
}
这是设计师的截图:
更多信息
要查找更多信息,请查看以下链接:
您的问题的解决方案
作为一种解决方案,只需移动private Numeric txtbox;
并将其作为第二个文件放在Exercise
类中就足够了。
答案 1 :(得分:1)
控件的声明应放入Designer.cs文件中,以便Visual Studio可以编译该单元并显示它。
启动应用程序时,编译器会考虑部分类的所有部分,然后找到txtBox声明。
尝试仅将表单类及其图形声明保留在单个文件中。 这个单个文件应该具有在InitializeComponent()中初始化的UI组件的InitializeComponent方法,构造函数和字段声明。