【问题标题】:WinForms designer strips away event handler assignments when upgrading formsWinForms 设计器在升级表单时剥离事件处理程序分配
【发布时间】:2017-04-18 08:13:29
【问题描述】:

我正在进行棕地开发,并且必须处理许多带有类似这样代码的旧表单。

// 
// Button1
// 
Button1.Location = new System.Drawing.Point(556, 447);
Button1.Name = "Button1";
Button1.Size = new System.Drawing.Size(136, 23);
Button1.TabIndex = 112;
Button1.Text = "Restart kontor";
Button1.Click += Button1_Click;

如果我尝试编辑其中一个表单,则会升级该表单。然后,所有标识符都将在前面加上“this”限定符。不幸的是,Visual Studio 2015 也将简单地删除文件中的所有事件处理程序分配。这意味着上面示例中的最后一行 sn-p 将简单地消失。

为什么会这样?有没有很简单的方法可以预防?

我找到了一种解决方法,可以相当快地完成每个表单。解决方法作为答案发布。它将我将这些表单升级的工作从几天缩短到几个小时。

如果有人知道更快的方法,也许是正确的解决方法,我想知道。

【问题讨论】:

  • 您是如何尝试编辑表单的——在设计器中,还是通过手动编辑设计器生成的代码?什么首先添加了该事件处理程序? (我认为设计器通常使用委托创建表达式,尽管我可能是错的。)永远不要手动编辑设计器生成的代码,除非你打算永远不再使用设计器 - 设计器“拥有”该代码,并且 将撤消您对其所做的更改。
  • 表格没有被手动编辑。这是 Visual Studio 中的一个错误。
  • 那么是什么生成了Button1.Click += Button1_Click; 代码?我认为我没有看到任何生成该代码的 VS 版本。如果你说是VS生成的,你知道具体是哪个版本吗?
  • 这确实是老源。不知道几岁了,但是很多表格都没有设计器源文件。相反,它都在一个文件中。不知道这是否能说明最古老部分的年龄。
  • 是的,这表明 VS2002/VS2003 - 这也表明手动添加代码 是完全可行的。不能不看源码历史吗?

标签: c# winforms


【解决方案1】:

解决方法

编辑整个表单以修复损坏的事件处理程序分配可能非常耗时。这种变通方法通过在设计人员尝试升级之前修复源代码,显着加快了流程。 (我不知道“升级”是否恰当,但谁在乎......)

在允许设计者升级表单之前,以这种方式手动编辑表单源。

使用事件处理程序编辑所有行,以便它们显式执行新的 System.EventHandler。查找相关行所要做的就是搜索“+=”。这就是问题中 sn-p 中的那一行。

Button1.Click += new System.EventHandler(Button1_Click);

完成后,您必须以某种方式触发设计器升级表单。这可以做到,例如通过设计器更改表单的标题,然后将其更改回来。设计师现在有望正确升级所有线路。升级后问题中的整个 sn-p 将如下所示。

    // 
    // Button1
    // 
    this.Button1.Location = new System.Drawing.Point(556, 447);
    this.Button1.Name = "Button1";
    this.Button1.Size = new System.Drawing.Size(136, 23);
    this.Button1.TabIndex = 112;
    this.Button1.Text = "Restart kontor";
    this.Button1.Click += new System.EventHandler(this.Button1_Click);

到目前为止,这种处理问题的方式为我提供了易于与原始表单进行比较的升级表单,这在验证升级时很重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多