好的,所以我需要一個方法遍歷Visual Studio 2008下的VB.net項目中的所有窗體,並創建一個類型爲form的數組,並引用其中的所有窗體,以便數組看起來像這樣(僞代碼)如何獲取數組中的VB.net(VS08)項目中的所有表單?
FormsArray() = [Form1, Form2, Form3, Form4]
但是,我不知道如何開始。
好的,所以我需要一個方法遍歷Visual Studio 2008下的VB.net項目中的所有窗體,並創建一個類型爲form的數組,並引用其中的所有窗體,以便數組看起來像這樣(僞代碼)如何獲取數組中的VB.net(VS08)項目中的所有表單?
FormsArray() = [Form1, Form2, Form3, Form4]
但是,我不知道如何開始。
2個選項
我會在實際項目文件加載到一個XML閱讀器。然後遍歷所有尋找所有Form SubTypes的節點,並將鏈接的文件存儲在一個數組中。如果文件的名稱與表單類的名稱相匹配,則可以從該列表創建FormsArray。否則,您必須加載每個文件並查找文件的公共類定義以獲取列表。
使用反射,使用Assembly.GetTypes檢查項目。找到所有的System.Windows.Forms.Form類型並將它們存儲在一個列表中。然後寫出Type.Name。
-1:Timore表示,「我會將實際的項目文件加載到XML閱讀器中」,正確的方法是使用VSTA。 – AMissico 2010-03-19 22:44:59
你需要寫一個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
這裏是你將如何做到這一點使用反射,假設您放置此代碼的類是在同一組件你想迭代。如果不是,那麼您需要將For Each循環中的Me.GetType()。Assembly程序更改爲其他方法來說明以不同方式加載程序集。
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
你必須調整功能,以放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)
)
應用嘿這是我在vb項目中獲取表單列表的過程,如何在代碼中不做這些事情,但是您可以編寫system.io代碼片段來做到這一點。
:)希望這有助於!
我不能讓這個版本的工作:
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始終沒有 所以我甩了formType線,只是修改了「IF」語句來檢查的基本類型來代替。這裏是新版本
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
等待...看看到目前爲止提供的答案,我很困惑你到底在找什麼。您是否想要在設計時在項目中定義的表單,還是希望在運行時獲取*程序集*中定義的表單? – Nick 2010-03-02 03:35:59
這是爲程序本身,還是爲Visual Studio插件? – 2012-12-03 01:50:31