2010-02-18 83 views
3

我有一個VB類,其中一個方法接受一個窗體數組。如何在VB.net中遍歷/遍歷表單中的所有對象?

對於數組中的每個表單,我需要它遍歷所有對象,檢查它們是否是特定的tyoe(輸入,標籤,複選框等)並獲取每個對象的屬性。然後,我要在以下格式轉儲這些到一個文本文件:

Form1 | Label1 | "Enter your name" 

「輸入您的姓名」爲標題或表單對象的文本。

我想這樣做,以方便翻譯一個應用程序。你可能對此有何想法或想法?

回答

1

您必須爲窗體的.Controls集合執行For Each。但是,請注意,如果表單的子控件在其自己的.Controls集合中擁有更多的控件,則它們不會被計入。你必須做一個遞歸函數來遍歷整個父子控制鏈來找到它們。

現在,對於每個控件,您可能希望執行一個Case語句來檢查每個控件的類型。然後將控件轉換爲它的類型並獲取屬性。

3

以下代碼將返回一個IEnumerable(Of Control),其中包含傳入控件的所有子控件。它將遞歸下降到樹上並獲取所有嵌套控件。

Public Function GetAllControls(ByVal source as Control) As IEnumerable(Of Control) 
    Dim seq = Enumerable.Empty(Of Control) 
    For Each child in source.Controls 
    if child.Controls.Count > 0 Then 
     seq = seq.Concat(GetAllControls(child)) 
    End If 
    Next 
    Return seq 
End Function 
+0

看起來你不會添加到seq集合。我認爲你需要像For seq.add(child)之類的東西。否則,你將永遠得到什麼不對? – sinDizzy 2013-09-03 05:43:32

+0

@sinDizzy查看'seq = seq.Concat(...)'行。這是添加到序列 – JaredPar 2013-09-03 17:34:53

+0

但這是一個遞歸調用。所以你進入這個循環越深入,讓我們說最後一個循環,它沒有增加任何東西。我說這個的原因是我在我的項目上嘗試過,並用(Me)作爲控件進行調用。沒有回來。 – sinDizzy 2013-09-04 02:47:11

1

如果你想要做的是能本地化表單,然後一個更簡單的方法是將窗體的Localizable屬性設置爲true。這將導致創建一個.resx文件,其中包含表單上所有控件的各種屬性的所有值,以便文本等可以作爲單獨的衛星程序集進行翻譯和分發。

1
Public Class Form1 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     ProcessForm(Me) 
    End Sub 

    Private Sub ProcessForm(ByVal frm As Form) 
     For Each el As Control In frm.Controls 
      Dim str As String 
      str = String.Format("{0} | {1} | {2}", frm.Name.ToString(), el.Name.ToString(), el.Text.ToString()) 
      Debug.Print(str) 
     Next 
    End Sub 
End Class