2010-03-01 41 views
2

好的,所以我需要一個方法遍歷Visual Studio 2008下的VB.net項目中的所有窗體,並創建一個類型爲form的數組,並引用其中的所有窗體,以便數組看起來像這樣(僞代碼)如何獲取數組中的VB.net(VS08)項目中的所有表單?

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

但是,我不知道如何開始。

+1

等待...看看到目前爲止提供的答案,我很困惑你到底在找什麼。您是否想要在設計時在項目中定義的表單,還是希望在運行時獲取*程序集*中定義的表單? – Nick 2010-03-02 03:35:59

+0

這是爲程序本身,還是爲Visual Studio插件? – 2012-12-03 01:50:31

回答

-1

2個選項

  1. 我會在實際項目文件加載到一個XML閱讀器。然後遍歷所有尋找所有Form SubTypes的節點,並將鏈接的文件存儲在一個數組中。如果文件的名稱與表單類的名稱相匹配,則可以從該列表創建FormsArray。否則,您必須加載每個文件並查找文件的公共類定義以獲取列表。

  2. 使用反射,使用Assembly.GetTypes檢查項目。找到所有的System.Windows.Forms.Form類型並將它們存儲在一個列表中。然後寫出Type.Name。

+0

-1:Timore表示,「我會將實際的項目文件加載到XML閱讀器中」,正確的方法是使用VSTA。 – AMissico 2010-03-19 22:44:59

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 
1

這裏是你將如何做到這一點使用反射,假設您放置此代碼的類是在同一組件你想迭代。如果不是,那麼您需要將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 
2

你必須調整功能,以放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

應用嘿這是我在vb項目中獲取表單列表的過程,如何在代碼中不做這些事情,但是您可以編寫system.io代碼片段來做到這一點。

  1. 打開命令提示符
  2. 到項目文件夾
  3. 運行DIR/S/B * .designer.vb >> LIST.TXT
  4. 使用記事本或sublimetext並對其進行編輯以獲取列表按你的喜好訂購。

:)希望這有助於!

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始終沒有 所以我甩了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 
相關問題