在具有组合框和文本框的 TableLayoutPanel 中创建重复行?

Creating a duplicate row in a TableLayoutPanel with both ComboBoxes and TextBoxes?

目前我有一个程序可以按日期过滤搜索条件。有四个不同的字段可以select(为保密而编辑):截止日期、开始日期、作业 1 截止日期和作业 2 截止日期。搜索条件可以从 ComboBox select 编辑,选项有全部、去年、上个月、上周、今天、本周、本月、今年、自定义。无论您 select 是什么范围,组合框旁边的两个文本框中都会显示过滤器的开始日期和结束日期。四个组合框和八个关联的文本框都在一个名为 TableLayoutPanel 的控件中。

我想通过添加额外的行来过滤结果来扩展我的程序的灵活性。例如,也许有人想要本周或几个月后的自定义范围内的截止日期。该程序目前运行良好,我唯一能让它运行的方法是创建一个全新的组合框行。我显然需要组合框和文本框的组合。我试图创建一个 List(Of List(Of Object)) 但我的代码会抛出错误。这是一些代码:

Dim Boxes As List(Of List(Of ComboBox))
Private Sub AddRow1()
Try
    Dim z As Integer = 0
    TableLayoutPanel.RowCount += 1
    TableLayoutPanel.GrowStyle = TableLayoutPanelGrowStyle.AddRows
    TableLayoutPanel.AutoSize = True
    TableLayoutPanel.RowStyles.Add(New System.Windows.Forms.RowStyle(SizeType.AutoSize))
    For j = 0 To 11
        Boxes.Add(New List(Of ComboBox))
        Boxes.Item(TableLayoutPanel.RowCount - 3).Add(New ComboBox)
        If Boxes.Item(TableLayoutPanel.RowCount - 3).Item(j).Created = False Then
            Boxes.Item(TableLayoutPanel.RowCount - 3).Item(j).Dock = DockStyle.Fill
            AddHandler Boxes.Item(TableLayoutPanel.RowCount - 3).Item(j).TextChanged,   AddressOf Me.concat
            If (j = 0 Or j = 3 Or j = 6 Or j = 9) Then
                For Each it In Copy(z)
                    Boxes.Item(TableLayoutPanel.RowCount - 3).Item(j).Items.Add(it)
                Next
                z = z + 1
            End If
            If (j = 0 Or j = 3 Or j = 6 Or j = 9) Then
                Boxes.Item(TableLayoutPanel.RowCount - 3).Item(j).AutoCompleteSource = AutoCompleteSource.ListItems
                Boxes.Item(TableLayoutPanel.RowCount - 3).Item(j).AutoCompleteMode = AutoCompleteMode.SuggestAppend
            End If
        End If

        TableLayoutPanel.Controls.Add(Boxes.Item(TableLayoutPanel.RowCount - 3).Item(j), j, TableLayoutPanel.RowCount - 1)

        Next
        DataGridView.Height = DataGridView.Height - 25
        DataGridView.Dock = DockStyle.Bottom
    Catch
    End Try
End Sub

创建 List(Of List(Of Object) 会在 AddHandler 方法调用和此方法中的其他一些地方引发错误,但我相信这就是我需要能够添加一行两个 ComboBoxes和文本框。

创建一个 List(Of List(Of Control)),然后可能使用 TypeOf 根据它实际是什么控件做出选择。

例如:

If TypeOf ctl Is ComboBox Then
   AddHandler CType(ctl, ComboBox).SelectedIndexChanged, AddressOf Handler1
ElseIf TypeOf ctl Is TextBox Then
   AddHandler CType(ctl, TextBox).TextChanged, AddressOf Handler2
End If

另外请注意,不同控件的许多事件的命名和装饰都是相同的。 TextChanged TextBox 和 ComboBox 完全相同,一个处理程序可以处理两种类型控件的事件。

使用 Control 而不是 Object 还可以更准确地指定类型,使您可以访问所有控件共享的许多属性,例如高度、文本等。您指定类型越准确,就越容易是。