3

我是 Visual C# 设计器的新手,所以这些是关于如何与设计器一起工作的一般且非常基本的问题。

例如,当我们向表单添加标签,然后在 Visual C# 设计器中双击它(我使用的是 Microsoft Visual C# 2008 Express Edition)时,会发生以下情况:

  1. 设计器在Form1.Designer.cs中生成代码(为简单起见假设默认名称)以添加标签,
  2. 然后双击它会将事件处理程序 label1_Click 添加到 Form1.Designer.cs 中的标签使用以下代码

    this.label1.Click += new System.EventHandler(this.label1_Click);

并将事件处理程序方法添加到Form1.cs

private void label1_Click(object sender, EventArgs e)
{

}

如果我现在删除标签,则只会删除 Form1.Designer.cs 中的代码,但 label1_Click 方法将保留在 Form1.cs 中,即使它没有被其他任何东西使用。但是,如果我在设计器中对 Click-event 使用 Properties->Events 中的重置,即使 Form1.cs 中的 label1_Click 方法也将被删除。

1.) 这不是有点不一致的行为吗?

2.) 删除此类生成的事件处理程序代码的推荐方法是什么?

3.) 使用设计师的最佳“思维方式”/最佳实践是什么?

我会通过心理分离的方式来处理它,Form1.cs 是我 100% 的责任,另一方面我根本不接触 Form1.Designer.cs 中的代码。这有意义吗?因为有时设计师会删除某事。来自 Form1.cs 我不确定这一点。

4

2 回答 2

2

1)是的,它是不一致的。一点。2)我使用了更简单的方法:简单地清除所有句柄代码并尝试编译 => 编译器会告诉您在哪里清除事件分配。尽管看起来很吓人,但它确实很安全。3) 这是我推荐的最佳实践,并在我的软件部门实施: 3a) 切换到 WPF(单独询问最佳 WPF 实践;还有很多其他问题);3b) 永远不要让 Visual Studio 自动生成事件代码(WPF 或 Windows.Forms);万一发生意外使用(2)尽快;3b) 对于事件分配,使用匿名 lambda:

ByButton.Click += (source, evArg) => { SomeHandler(...); };

对于 v.2.0:

ByButton.Click += delegate(object source, EventArgs evArgs) { SomeHandler(...); };

有很多好处:您的处理程序不必使用特定的方法配置文件;您可以将整个代码放在匿名处理程序中,它是否足够短,以 lambda 形式您可能永远不需要知道事件参数的类型...

于 2010-05-21T20:42:31.037 回答
1

Visual Studio 中可能内置了一个安全元素。

例如:

  • 添加一个按钮A和一个点击事件。
  • 从另一个按钮B引用按钮A 的单击事件。
  • 移除按钮A
    • 如果代码要运行,那么按钮B会损坏
    • 如果代码仍然存在,则按钮B继续工作。

我通常注释掉在designer.cs 文件中中断的任何代码(事件处理程序)。

于 2010-03-31T21:00:30.270 回答