在具有组合框和文本框的 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 还可以更准确地指定类型,使您可以访问所有控件共享的许多属性,例如高度、文本等。您指定类型越准确,就越容易是。
目前我有一个程序可以按日期过滤搜索条件。有四个不同的字段可以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 还可以更准确地指定类型,使您可以访问所有控件共享的许多属性,例如高度、文本等。您指定类型越准确,就越容易是。