为表单创建部分类

时间:2010-11-30 16:28:13

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

我想为我的表单创建一个部分类。我有很多事件,它变得混乱,所以我想将部分分解成自己的文件。

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

Partial Public Class Form1

End Class

Visual Studio决定我需要另一个表格用于此分部类。

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

6 个答案:

答案 0 :(得分:4)

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

其他事情也出了问题,设计师在将文件从一个文件移动到另一个文件时无法再跟踪事件处理程序。并且很容易让你添加另一个更棘手的错误来源。

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

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

可以运行良好的东西是将控制+代码隔离到单独的UserControl中。但是,您必须小心谨慎,不必添加一堆暴露内部控件的属性和事件。

答案 1 :(得分:2)

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

可能使用DesignerCategoryAttribute Class

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

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

 End Class

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

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

更多细节here

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

#Region "RegionA"

#End Region

我将此方法称为“hack”,因此下面的注释。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

Public Class Main 'saved in Form1.vb

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

Partial Class Main 'saved in Form1.Designer.vb
然后我创建了另一个&#34;部分类&#34;同名:

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