好吧,所以我需要一个遍历Visual Studio 2008下VB.net项目中所有表单的方法,并创建一个类型为form的数组,并引用其中的所有表单,以便数组看起来像这样(伪代码)
FormsArray() = [Form1, Form2, Form3, Form4]
但是,我对如何开始没有任何线索。
答案 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代码片段来做到这一点。
:)希望这有帮助!
答案 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个选项
我会将实际的项目文件加载到XML阅读器中。然后迭代所有节点,查找所有Form SubType并将链接的文件存储在一个数组中。如果文件名与表单类的名称匹配,则可以从该列表创建FormsArray。否则,您必须加载每个文件并查找该文件的公共类定义以获取列表。
使用Reflection,使用Assembly.GetTypes检查项目。找到所有System.Windows.Forms.Form类型并将它们存储在列表中。然后写出Type.Name。