第一档:
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运行代码时,一切看起来都很好:表单弹出文本框.
但出于某种原因,当我右键单击第二个文件并选择“视图设计器”时,我收到一条错误,上面写着“变量’txtBox’未声明或未被分配”.我可以选择“忽略并继续”,这会将我引导到一个没有文本框的表单.
为什么会这样?我知道有些人认为我应该使用工具箱,这可能是最明智的做法,但我仍然想知道为什么会这样.
解决方法
一些有用的事实:
>表单构造函数中的代码不会在设计时执行,但表单基类的构造函数将在设计时执行.
> InitializeComponent中的代码不会在设计时执行,但这些代码将被反序列化,并将用于创建表单的设计者.
>设计器无法显示具有抽象基类的表单. (solution)
>设计者无法显示具有泛型类的表单.例如,它无法显示MyForm:SomeForm< SomeClass>,但它可以显示SomeForm< T>:Form. (solution)
>如果为表单定义新属性,则属性将不会显示在属性窗口中.属性窗口显示基类的属性,但包含表单的值.
>当一个文件包含2个类时,如果表单不是第一个类,则设计器无法加载,并且您会收到一条警告,指出该表单应该是第一个在设计器中显示的类.
>以上规则也适用于UserControls.
例
看看下面的代码,它有一些严重的问题:
>该类具有与类名不同的构造函数
>语句int i =“x”;
>这是一个C#类,没有分号
> 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 } }
这是设计师的截图:
更多信息
要查找更多信息,请查看以下链接:
> How does the Windows Forms designer in Visual Studio load a Form?
解决您的问题