我有一個VB類,其中一個方法接受一個窗體數組。如何在VB.net中遍歷/遍歷表單中的所有對象?
對於數組中的每個表單,我需要它遍歷所有對象,檢查它們是否是特定的tyoe(輸入,標籤,複選框等)並獲取每個對象的屬性。然後,我要在以下格式轉儲這些到一個文本文件:
Form1 | Label1 | "Enter your name"
「輸入您的姓名」爲標題或表單對象的文本。
我想這樣做,以方便翻譯一個應用程序。你可能對此有何想法或想法?
我有一個VB類,其中一個方法接受一個窗體數組。如何在VB.net中遍歷/遍歷表單中的所有對象?
對於數組中的每個表單,我需要它遍歷所有對象,檢查它們是否是特定的tyoe(輸入,標籤,複選框等)並獲取每個對象的屬性。然後,我要在以下格式轉儲這些到一個文本文件:
Form1 | Label1 | "Enter your name"
「輸入您的姓名」爲標題或表單對象的文本。
我想這樣做,以方便翻譯一個應用程序。你可能對此有何想法或想法?
您必須爲窗體的.Controls集合執行For Each。但是,請注意,如果表單的子控件在其自己的.Controls集合中擁有更多的控件,則它們不會被計入。你必須做一個遞歸函數來遍歷整個父子控制鏈來找到它們。
現在,對於每個控件,您可能希望執行一個Case語句來檢查每個控件的類型。然後將控件轉換爲它的類型並獲取屬性。
以下代碼將返回一個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
如果你想要做的是能本地化表單,然後一個更簡單的方法是將窗體的Localizable屬性設置爲true。這將導致創建一個.resx文件,其中包含表單上所有控件的各種屬性的所有值,以便文本等可以作爲單獨的衛星程序集進行翻譯和分發。
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
看起來你不會添加到seq集合。我認爲你需要像For seq.add(child)之類的東西。否則,你將永遠得到什麼不對? – sinDizzy 2013-09-03 05:43:32
@sinDizzy查看'seq = seq.Concat(...)'行。這是添加到序列 – JaredPar 2013-09-03 17:34:53
但這是一個遞歸調用。所以你進入這個循環越深入,讓我們說最後一個循環,它沒有增加任何東西。我說這個的原因是我在我的項目上嘗試過,並用(Me)作爲控件進行調用。沒有回來。 – sinDizzy 2013-09-04 02:47:11