【问题标题】:Creating a Partial Class for a Form为表单创建部分类
【发布时间】:2010-11-30 16:28:12
【问题描述】:

我想为我的表单创建一个部分类。我有很多活动,而且很混乱,所以我想将部分分解成自己的文件。

问题:当我创建表单的部分类时,说:

Partial Public Class Form1

End Class

Visual Studio 决定我需要这个部分类的另一种形式。

问题:
1. 如何为表单创建分部类?
2. 如果我不能这样做,我如何将表单中的所有事件分解到不同的文件中?

【问题讨论】:

    标签: vb.net winforms visual-studio-2010


    【解决方案1】:

    是的,确实如此。只要您在此幻像窗体上放置一个控件,您就会将设计时代码 (InitializeComponent) 生成到该源代码文件中。这是 .NET 1.x 的兼容性行为,它不支持 Partial 关键字。这将破坏构建,现在有两个。仔细点击可以避免这种情况,但您知道它迟早会发生。

    顺便说一句,其他事情也出错了,当您将事件处理程序从一个文件移动到另一个文件时,设计器无法再跟踪它。并且很容易让您添加另一个更棘手的错误来源。

    这不是很好,放弃希望依靠它来解决你的问题。

    一般的诊断是复杂的用户界面会产生复杂的代码。但毫无疑问,那艘船已经航行了。更结构化的解决方案是追求 MVC 模型,将数据与数据视图分离。您仍然会有很多事件处理程序,但它们除了调用执行实际工作的类的方法之外不会做任何事情。其源代码当然可以存在于另一个源代码文件中。典型的挂断是 Windows 窗体对此没有任何内置支持,您必须手动制作它。没有什么类似于 WPF 中的 MVVM 模型。

    可以很好地工作的东西是将控件 + 代码隔离到单独的 UserControl 中。不过,您必须谨慎行事,您不希望添加一堆暴露内部控制的属性和事件。

    【讨论】:

    • 所以我不能在表单中使用部分类。真可惜。是的,表单中有大量的用户控件,但它们被分成几个选项卡。也许我可以将每个选项卡移动到自己的形式中。听起来我已经在遵循 MVC 模型了。您能否扩展关于用户控件的最后一段?
    • 如果您已经将 UserControls 放在选项卡上,那么您就不会领先。这些 UC 的代码应该已经在另一个文件中。
    • "...但你知道它迟早会发生。"汉斯是正确的,它发生在我身上。我正在更新代码中的所有表单,结果无意中更改了部分类中的表单。砰——是时候清理一下了!应该避免这种类型的偏类!我最终将所有内容移动到原始表单类中的一个新区域(现在),并删除了表单和触摸表单时生成的额外 vs 代码。
    【解决方案2】:

    有时我会创建部分类以提高可读性,尤其是当我有非常大的类时。 但是当我单击部分类时,VS IDE 将打开表单编辑器,向我显示一个空表单。如果我不在乎,我可能会损坏主窗体(这似乎是 VS 2008/2010 的错误)

    可能是使用DesignerCategoryAttribute Class

    用属性“code”标记部分类。

     <System.ComponentModel.DesignerCategory("code")>
     Partial Class Form1
    
     End Class
    

    这样,当您单击文件时,您会在代码编辑器中打开该类。 当然,这将适用于所有文件,也适用于主表单文件。 如果你想在表单编辑器中再次编辑你的表单,你必须引用属性:

     '<System.ComponentModel.DesignerCategory("code")>
    

    更多细节here

    【讨论】:

      【解决方案3】:

      虽然它没有回答最初的问题,但我发现使用 regions 使我的代码更易于管理/可读。

      #Region "RegionA"
      
      #End Region
      

      我最初将这种方法称为“hack”,因此下面的评论。

      【讨论】:

        【解决方案4】:

        不确定你的意思是“Visual Studio 决定你需要另一个表单”,但是,你确定新的 Form1 部分类是在相应的原始命名空间中声明的吗?

        给定 .NET 类型的所有部分类当然必须在同一个命名空间中声明(无论它们存储在什么文件上)。

        【讨论】:

          【解决方案5】:

          我很欣赏 Hans 给出的答案,我完全没有异议。奇怪的是,在 Visual Studio 2010 中,当您创建一个名为 say Main 的表单时,您会得到一个 Main.designer.vb,它是一个分部类。它在顶部显示“Partial Class Main”。单击时此类不会打开表单。它还包括对事件处理程序的引用。所以我想知道他们如何解决这个问题?有没有办法创建这些“特殊”部分类中的一个,它可以按我们的预期工作。

          我注意到,当我创建一个 Form Partial 类时,图标从一个类图标变成了一个表单图标。与 Main.designer.vb 文件关联的图标看起来像一个带箭头的类图标。

          【讨论】:

            【解决方案6】:

            对我有用(VS 2010)的方法是命名 Form1 类,该类已经用自己的设计器 (Form1.Designer.vb) 保存在 Form1.vb 中:

            Public Class Main 'saved in Form1.vb
            

            VS 将设计器中的名称更新为:

            Partial Class Main 'saved in Form1.Designer.vb
            

            然后我创建了另一个同名的“部分类”:

            Partial Class Main 'saved in Main.vb
            

            无论我是在编辑 Form1.vb 还是 Main.vb VS 都会在顶部导航盘上显示所有例程、函数、子程序,甚至是后台工作人员和计时器。对于事件处理程序,为了避免前面提到的漏洞(您在布局设计器中单击一个控件,将在原始 Form1.vb 中创建一个全新的事件处理程序)我去:

            Partial Public Class Main 'in Form1.vb file
                Private Sub SomeControl_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SomeControl.Click
                    Call SomeControlClick(sender, e)
                End Sub
            End Class
            
            Partial Public Class Main 'then in Main.vb file
                Private Sub SomeControlClick(ByVal sender As Object, ByVal e  As System.EventArgs)
                    'blah blah
                End Sub
            End Class
            

            【讨论】:

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