如何在一个数组中的VB.net(VS08)项目中获取所有表单?

时间:2010-03-01 22:27:05

标签: vb.net

好吧,所以我需要一个遍历Visual Studio 2008下VB.net项目中所有表单的方法,并创建一个类型为form的数组,并引用其中的所有表单,以便数组看起来像这样(伪代码)

FormsArray() = [Form1, Form2, Form3, Form4]

但是,我对如何开始没有任何线索。

6 个答案:

答案 0 :(得分:3)

您必须调整函数以将msgbox的结果放入数组

Public Sub getallforms(ByVal sender As Object)
    Dim Forms As New List(Of Form)()
    Dim formType As Type = Type.GetType("System.Windows.Forms.Form")
    For Each t As Type In sender.GetType().Assembly.GetTypes()
        If UCase(t.BaseType.ToString) = "SYSTEM.WINDOWS.FORMS.FORM" Then
            MsgBox(t.Name)
        End If
    Next
End Sub

您必须从应用程序中的任何表单(如getallforms(me)

调用该函数

答案 1 :(得分:2)

以下是使用Reflection执行此操作的方法,假设您放置此代码的类位于您想要迭代的同一个程序集中。如果没有,那么你需要更改Me.GetType()。在For Each循环中组装成其他东西,以便以不同的方式加载程序集。

Dim Forms As New List(Of Form)()
Dim formType As Type = Type.GetType("System.Windows.Forms.Form")

For Each t As Type In Me.GetType().Assembly.GetTypes()
    If t.IsSubclassOf(formType) = True Then
        Forms.Add(CType(Activator.CreateInstance(t), Form))
    End If
Next

答案 2 :(得分:1)

嘿,这就是我在我的vb项目中获取表单列表所做的事情,但是如果不是在代码中,你可以编写system.io代码片段来做到这一点。

  1. 打开cmd提示
  2. 转到项目文件夹
  3. 运行dir / s / b * .designer.vb>> LIST.TXT
  4. 使用notepad或sublimetext并编辑它以获得您喜欢的列表。
  5. :)希望这有帮助!

答案 3 :(得分:0)

您需要编写VS宏或Addin。

在其中,从DTE或DTE2实例,您可以写:

Public Sub GetForms(ByVal host As DTE2)

    Dim project As Project = host.ActiveDocument.ProjectItem.ContainingProject
    For Each ce As CodeElement In project.CodeModel.CodeElements

        If ce.Kind = vsCMElement.vsCMElementClass Then

            Dim cl As CodeClass = CType(ce, CodeClass)
            If cl.IsDerivedFrom("System.Windows.Forms) Then

                ' do something
            End If
        End If
    Next
End Sub

答案 4 :(得分:0)

我无法使用此版本:

Dim Forms As New List(Of Form)()
Dim formType As Type = Type.GetType("System.Windows.Forms.Form")

For Each t As Type In Me.GetType().Assembly.GetTypes()
    If t.IsSubclassOf(formType) = True Then
        Forms.Add(CType(Activator.CreateInstance(t), Form))
    End If
Next

在VB2010中,formType始终是Nothing 所以我抛弃了formType行并简单地修改了你的' IF'用于检查BaseType的语句。这是新版本

Dim Forms As New List(Of Form)()
For Each t As Type In Me.GetType().Assembly.GetTypes()
    If t.BaseType.Name = "Form" Then
        Forms.Add(CType(Activator.CreateInstance(t), Form))
    End If
Next

答案 5 :(得分:-1)

2个选项

  1. 我会将实际的项目文件加载到XML阅读器中。然后迭代所有节点,查找所有Form SubType并将链接的文件存储在一个数组中。如果文件名与表单类的名称匹配,则可以从该列表创建FormsArray。否则,您必须加载每个文件并查找该文件的公共类定义以获取列表。

  2. 使用Reflection,使用Assembly.GetTypes检查项目。找到所有System.Windows.Forms.Form类型并将它们存储在列表中。然后写出Type.Name。