更改Windows窗体设计会删除一些不相关的代码

时间:2018-11-07 02:41:54

标签: c# forms winforms

我遇到一个奇怪的问题,可能是我的无知所致。

我有一个treeview和一个.AfterSelect,并且每当我更改表单的设计时(在设计视图中),由于某种原因,代码都会被删除。

这是我的代码

this.lstTreeView.AfterSelect += LstTreeView_AfterSelect; < this is the code that gets removed
this.lstTreeView.Location = new System.Drawing.Point(194, 56);
this.lstTreeView.Name = "lstTreeView";
this.lstTreeView.Size = new System.Drawing.Size(220, 498);
this.lstTreeView.TabIndex = 6;

这是它允许工作的代码。

private void LstTreeView_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
    {
        TreeNode CurrentNode = e.Node;
        string fullpath = CurrentNode.FullPath;
        MessageBox.Show(fullpath);
        NrDirSearch(fullpath);

    }

如果有人可以给我一些有关为什么删除.AfterSelect的建议,那将非常有帮助。

2 个答案:

答案 0 :(得分:2)

我建议你:

  • 在Windows窗体设计器中,单击树视图将其选中
  • 在属性网格中,单击闪电并滚动查找AfterSelect事件
  • 右键单击名称AfterSelect,然后选择重置
  • 全部保存
  • 完全关闭状态/关闭Visual Studio
  • 重新启动/重新加载解决方案 回到上面的AfterSelect事件,其框应该为空
  • 点击下拉菜单,然后选择您现有的事件处理程序
  • 保存所有,退出并重新启动vs,并检查设置是否保持不变

如果您发现它没有粘住,请检查您是否没有在其他程序中打开设计器,例如可以自动保存缺少事件处理程序的旧版本文件的文本编辑器吗?

顺便说一句,上面的过程是在“设计”视图中添加事件的方式-单击相关控件,闪电,滚动到所需的事件,双击事件的名称,然后您将被带到新的代码中已创建命名的事件处理程序并准备填充

如果您未在其中编写任何代码,而是返回设计器并按照项目符号列表说明重置事件,则代码中的事件处理程序方法将消失。如果您将代码写入事件处理程序,则在重置时不会将其删除,而是在重置期间仅删除空的处理程序方法

旁注:如果您看到一条消息,如“执行此撤消操作将导致其他地方的工作丢失”之类的消息,请谨慎使用“撤消”,它通常表示Windows窗体design或designer.cs代码将随着操作而改变撤消

设计器文件可以安全地进行手动编辑,并且有时如果内容进入使设计器崩溃的状态,则有时是必要的。从我的代码中删除仍在设计器中引用的事件处理程序时,我最经常遇到这种情况。出现一个屏幕,指出问题阻止了表单设计器的出现,并指示设计器文件中的错误行。过去,我还直接编辑了设计器以设置大量属性,而又没有使用设计器的麻烦-请注意不要在编辑designer.ca文件的同时打开Windows窗体设计器,因为窗体设计器会可能会覆盖您的更改。只要您牢记在同一时间在任何两个不同的编辑器中打开同一文件可能会导致冲突和工作损失,并在继续进行进一步的编辑之前,采取步骤确保在一个编辑器中反映出另一个编辑器中的内容。其他编辑器,您会很好的:)

编辑:上面说了这一段,米奇D让我意识到了我所忽略的一个重要观点:

designer.cs文件由表单设计器读取,并用于构建表单,按钮,属性等的内容。因此,如果要在文本编辑器中编辑designer.cs,则应限制编辑仅限于表单设计者下次写入文件时可以使用,理解,表示和保留的那些内容。添加一行以将按钮设置为启用即可。删除导致其崩溃的行也很好。放入27种实现整个程序的数据库访问策略的方法不是一个好主意,因为在设计人员读取文件时不会注意或将其用于构建表单,因此在设计人员编写文件时会丢失该方法。如果不确定要保留的内容和将要保留的内容之间的区别,请仅删除或修复现有的行,而不是添加新的代码行

答案 1 :(得分:0)

绝对不要 [1] 修改 *。designer.cs 文件。它们是代码生成的。您所做的任何更改都将被覆盖。

您可以使用WinForms GUI窗体设计器直观地设置事件处理程序,也可以在窗体的代码隐藏.cs文件中的代码中进行设置。

网络上有很多有关如何使用WinForms设计器的资源。


[1] 有关我同意的规则的例外情况,请参见下面的Caius Jard的评论