如何通过递归检查GroupBox中的控件(显示名称和类型)并在DataGridView上显示?

时间:2019-06-26 04:24:44

标签: vb.net winforms 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的 Name type ,请帮助我使用递归功能检查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列 Name Type

的控件信息

1 个答案:

答案 0 :(得分:0)

您可以将DataTable的创建和Controls枚举拆分为两种不同的方法:

  • 第一个方法是公共方法,可以通过传递从其开始枚举的Parent控件来调用。
  • 此方法仅创建一个DataTable,然后调用private方法以将其枚举结果填充其中
  • 私有方法为找到的每个控件创建一个新的DataRow,并将其添加到DataTable中。

您还可以修改private方法以返回对象列表,此对象之后可以转换为DataTable。

我添加了一个名为"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中查找控件,可以使用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]可以是public方法或DataGridView.DataSource返回的原始DataTable:

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