我想知道是否有辦法遍歷我專案中的所有控制元件。將它們放在 WinForm 或 UserControl 上,即使它們未加載。我想這樣做,以便我可以獲得.Tag每個控制元件的屬性,以及它的名稱和父級。
到目前為止,我可以獲取 My 命名空間中的所有型別,但從那里我不知道該怎么做。
Private Function GetTypesInNamespace(ByVal assembly As Assembly, ByVal [nameSpace] As String) As Type()
Return assembly.GetTypes().Where(Function(t) String.Equals(t.[Namespace], [nameSpace], StringComparison.Ordinal)).ToArray()
End Function
uj5u.com熱心網友回復:
為此,我將忽略命名空間。如果您愿意,可以添加它。但是這個函式做了你的函式聲稱要做的事情。
Public Function getAllTypesOfControl(assembly As Assembly) As IEnumerable(Of Type)
Return assembly.GetTypes().
Where(Function(t) t.IsSubclassOf(GetType(ContainerControl))).
SelectMany(Function(container) container.GetFields(BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.Public)).
Where(Function(f) f.FieldType.IsSubclassOf(GetType(Control))).
Select(Function(f) f.FieldType)
End Function
現在,您將擁有在作為 ContainerControl 的 Controls 中定義的所有控制元件的所有型別。正如您提到的,這應該包括在 Forms 和 UserControls 中定義的控制元件。
你能用這個做點什么嗎?我不這么認為,因為您希望訪問控制元件實體。為此,您不應該處理 Assembly 的機制,而應該處理您的runtime,它應該具有您的實體化控制元件。我認為?
您可能需要查看
Form1.Designer.vb
Partial Class Form1
Inherits System.Windows.Forms.Form
Public Sub New()
InitializeComponent()
End Sub
Private Sub InitializeComponent()
' ...
Me.Button1 = New System.Windows.Forms.Button()
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(157, 103)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(75, 23)
Me.Button1.TabIndex = 3
Me.Button1.Text = "Button1"
Me.Button1.UseVisualStyleBackColor = True
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(203, 114)
Me.Controls.Add(Me.Button1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
Friend WithEvents Button1 As Button
End Class
您可以修改或洗掉該按鈕并觀察代碼更改或從 Form1.Designer.vb 中消失。因此,您的“詳細資訊”存盤在代碼中。這就是 Visual Basic 中“Visual”在幕后的含義。
所以這些細節只在你運行 InitializeComponent 時設定,這意味著它們有兩種設定方式:
- 在 Visual Studio Form1 設計視圖中
- 運行應用程式并創建 Form1 實體時
除了這兩種方式之外,控制元件屬性沒有您的值,并且只有默認值(但這確實是一種不可能的情況并且相關性可疑)。
知道這一點后,您必須訪問控制元件實體,這是通過 Application.OpenForms 選項實作的。我認為您可以加載所有控制元件,并寫入一些設定檔案或資料庫,還可以回讀并查找控制元件并根據設定檔案或資料庫更新它們。不過我不是這樣寫的。我想我回答了你的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/378929.html
