簡體   English   中英

如何通過遞歸檢查GroupBox中的控件(顯示名稱和類型)並在DataGridView上顯示?

[英]How to check the controls (display name and type) in the GroupBox by recursion and display on a DataGridView?

如何讀取控制器屬性,自動添加到分配給DataGridView的表中?

Dim dt As DataTable = New DataTable
dt.Columns.Add("Name")
dt.Columns.Add("Type")
Dim n As Integer = Me.Controls.Count
For i As Integer = 0 To n - 1
    dt.Rows.Add(Me.Controls(i).Name.ToString, Me.Controls(i).GetType.ToString)
Next

DataGridView1.DataSource = dt

上面是對窗體中控件的檢查,它只顯示GroupBox的Nametype ,幫助我使用遞歸函數檢查GroupBox中的控件。

以下是我的想法,但是沒有用:

Public Sub V_gr(ByVal _Obj As Object)
    dt.Columns.Add("Name")
    dt.Columns.Add("Type")
    If (_Obj.Controls.count > 0) Then
        Dim i As Integer = _Obj.Controls.count - 1
        dt.Rows.Add(_Obj.Controls(i).Name.ToString, _Obj.Controls(i).GetType.ToString)
        DataGridView1.DataSource = dt
    End If
End Sub

使用分配給DataGridView的臨時表並使用2列NameType顯示在其上檢查的控件信息

您可以將DataTable的創建和Controls枚舉拆分為兩種不同的方法:

  • 第一種方法是公共方法,可以通過傳遞從其開始枚舉的Parent控件來調用。
  • 此方法只是創建一個DataTable,然后調用private方法以將其枚舉結果填充其中
  • private方法為找到的每個控件創建一個新的DataRow,並將其添加到DataTable中。

您還可以修改private方法以返回對象列表,該對象列表之后可以轉換為DataTable。

我添加了一個名為"Parent"的列,該列引用了控件的Parent。 了解哪些是這些控件的父級可能很有用。

' Find all Controls in the current Form
DataGridView1.DataSource = ControlsListToDataTable(Me)

Private Function ControlsListToDataTable(parent As Control) As DataTable
    If (parent Is Nothing) OrElse (Not parent.HasChildren) Then Return Nothing
    Dim dt As DataTable = New DataTable("ParentControls")
    dt.Columns.AddRange({
        New DataColumn() With {.ColumnName = "Name", .DataType = GetType(String)},
        New DataColumn() With {.ColumnName = "Type", .DataType = GetType(String)},
        New DataColumn() With {.ColumnName = "Parent", .DataType = GetType(String)}
    })
    GetAllControls(parent, dt)
    Return dt
End Function

Private Sub GetAllControls(parent As Control, dt As DataTable)
    For Each ctl As Control In parent.Controls.OfType(Of Control)
        dt.Rows.Add({ctl.Name, ctl.GetType().FullName, ctl.Parent.Name})
        If ctl.HasChildren Then GetAllControls(ctl, dt)
    Next
End Sub

要在數據表中找到控件,可以使用DataTable.DefaultView的Sort和FindRows方法:

[DataTable].DefaultView.Sort = "Name"
Dim result = [DataTable].DefaultView.FindRows("TextBox1")

或使用LINQ方法:

Dim control = [DataTable].Rows.OfType(Of DataRow)().
              FirstOrDefault(Function(dr) dr(0).ToString().Equals("TextBox1"))

其中[DataTable]可以是公共方法或DataGridView.DataSource返回的原始DataTable:

 Dim dt = CType(DataGridView1.DataSource, DataTable)
 Dim control = dt.Rows.OfType(Of DataRow)(). (... etc ...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM