手动编辑* .designer.cs文件

时间:2013-04-23 05:57:25

标签: c# designer

我知道,.designer.cs文件包含Visual Studio中可视窗体设计器生成的数据。但是,我还有一些额外的方法,我想将它们放入.designer.cs文件中,因为它们负责较低级别的表单处理(例如,我的可视状态管理器)。

InitializeComponent文件中的.designer.cs方法有一条注释说明它是自动生成的,不应由用户修改。此限制是否仅适用于该方法,或者用户根本不应编辑.designer.cs文件?我注意到,除其他外,它包含用户可能想要修改的Dispose()方法 - 建议第一个选项。不过,我想确定一下。

5 个答案:

答案 0 :(得分:9)

你永远不应该修改.designer.cs。期。您的更改将被无限制地覆盖。

更新为了更有帮助,C#自v3(VS 2008)包含了部分方法,许多设计人员现在都会使用这些方法来实现自定义行为。

答案 1 :(得分:5)

此指令适用于完整的designer.cs文件。 因为所有编写的代码都是自动生成的。

您不应该对此文件进行任何修改,因为它可以随时重新创建...这将删除您的方法......

如果您想将代码与表单代码文件分开,那么我建议创建另一个包含部分类的文件,您可以在其中放置所有这些方法......

希望它有所帮助...

答案 2 :(得分:5)

我认为其他答案正在简化太多。

首先,我完全同意编辑.designer文件几乎总是一个坏主意,但有一些情况我已经这样做了,觉得它很好,也很合适,并没有被烧伤。

  1. 假设我创建了一个标签并意外双击。 Designer在我的主.cs文件中创建一个方法然后删除:

    private void label1_Click(object sender, EventArgs e)
    {
    
    }
    

    好吧,现在代码不会构建,除非我还从我的.designer文件中删除了以下内容:

    this.label1.Click += new System.EventHandler(this.label1_Click);
    
  2. 不太常见,事物被添加到表单或面板(或菜单!)的顺序很重要,并且在代码中更改此顺序比在Designer GUI中更容易。根据我的经验,VS 2010总是对此有所了解,更新其GUI的信息,并重新绘制其预览。只记得关注Add()方法 - 声明的顺序变量通常无关紧要。

  3. 同样,如果您设置的属性会导致将行添加到.designer文件中,则删除该行会快速获取并且Designer会刷新。也许使用GUI更改属性更明智/更安全,但我认为删除该行更清晰。

  4. 不在此区域内的代码#region Windows Form Designer generated code只会生成一次。移动是安全的,正如其他人在其他地方推荐的那样(https://stackoverflow.com/a/6527072/1593924),如果您正在修改Dispose(bool)或者添加Dispose(),那么实际移动Dispose(bool)方法会非常有意义。理想情况下应该位于protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); 旁边的方法。

    Dispose(bool)
  5. 免责声明:

    1. 那就是说,我只尝试过VS 2010 Ultimate;您的里程可能会在上面的1-3上有所不同,但只要.designer是#region之外的Dispose(bool disposing)的部分类,{4}应该是安全的。我还确保将最新版本的.designer文件提交到源存储库中,然后再将其搞砸。

    2. 通过承认Dispose()模式,我并不是要推广这种方法。在大多数情况下,似乎有good reasonssimply do more使用{{1}},而对于非托管资源似乎只有{{3}},每个资源都被封装为一对一一个专用的Disposable对象。

答案 3 :(得分:1)

让peace.cs平静下来不仅可以防止您的更改被覆盖,而且还可以帮助其他开发人员说不会出现意外情况。话虽如此,我至少可以想到一个例外,那就是帖子作者提到的例外:Dispose()方法的扩展。据我所知,这段代码 - 一旦生成 - 将不会被覆盖。

但是,在我看来,更好的解决方案是覆盖Dispose方法而不是调用base.Dispose(),这样我们就可以使designer.cs保持干净。

答案 4 :(得分:0)

部分设计器表单类,Visual Studio使用它来放置构建控件所需的所有代码。

方法InitializeComponent()不能覆盖:设计器编辑器使用它来渲染表单的预览! 尝试新项目:调整表单大小,添加标签和按钮,并重命名InitializeComponent()方法+重新编译。 您的表单恢复为默认大小!

如果需要通过表单加载来调用代码,只需重写OnLoad()虚方法,如果需要通过表单显示调用代码,则简单覆盖OnShown()虚方法。

请记住在覆盖开始时调用base.Method()。

希望这一点我的经验可以提供帮助!