使用ComboBoxes和TextBoxes在TableLayoutPanel中创建重复的行?

时间:2016-02-03 15:11:42

标签: vb.net combobox textbox tablelayoutpanel

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

我想通过添加额外的行来过滤结果来扩展我的程序的灵活性。例如,也许有人想要本周的截止日期或在几个月内的自定义范围内。该程序目前工作正常,它只是我可以使这个工作的唯一方法是创建一个全新的ComboBoxes行。我显然需要混合使用ComboBoxes和TextBoxes。我试图创建一个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和TextBoxes。

1 个答案:

答案 0 :(得分:0)

创建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

另外,请注意,不同控件的许多事件都以相同的方式命名和修饰。对于TextBox和ComboBox,TextChanged完全相同,并且一个处理程序可以处理这两种控件类型的事件。

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