gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:01:19 24 4
gpt4 key购买 nike

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

按照教程,我在以下两段代码中创建了一个部分类:

第一个文件:

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 设计器”时,我收到一条错误消息,显示“变量‘txtbox’未声明或从未分配”。我可以选择“忽略并继续”,这会将我带到一个没有文本框的表单。

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

最佳答案

Windows 窗体设计器如何工作?

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

一些有用的事实:

  • Form 的构造函数中的代码不会在设计时执行,但表单基类的构造函数会在设计时执行。
  • 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
}
}

这是设计师的截图:

enter image description here

更多信息

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

您的问题的解决方案

作为解决方案,你动private Numeric txtbox;就够了并将它放在你的第二个文件中 Exercise类。

关于c# - 在 C# 中编写表单时无法查看设计器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32298865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com