【问题标题】:Checkbox bidimensional array does not working复选框二维数组不起作用
【发布时间】:2021-01-30 01:09:27
【问题描述】:

我想创建一个二维数组以在行和列中绘制复选框。然而,这条线不起作用: CheckB_Well(rows_C1, cols_C1).Location = 新点(40 + 50 * cols_C1, 20 + 25 * (well_rows - 1 - rows_C1))

复选框未显示在定义的位置。

Sub Check_Panel()
    Me.GroupBox3.Controls.Clear()
    Dim CheckB_Well(,)
    Dim rows_C1 As Integer
    Dim cols_C1 As Integer

    If Opt6.Checked = True Then
        well_number = 6
        well_rows = 2
        well_cols = 3
    ElseIf Opt12.Checked = True Then
        well_number = 12
        well_rows = 3
        well_cols = 4
    ElseIf Opt24.Checked = True Then
        well_number = 24
        well_rows = 4
        well_cols = 6
    End If

    ReDim CheckB_Well(well_rows - 1, well_cols - 1)

    For rows_C1 = 0 To well_rows - 1
        For cols_C1 = 0 To well_cols - 1
            CheckB_Well(rows_C1, cols_C1) = New CheckBox
            CheckB_Well(rows_C1, cols_C1).Name = "Well" + Str(rows_C1) + ";" + Str(cols_C1)
            CheckB_Well(rows_C1, cols_C1).Text = Str(rows_C1) + ";" + Str(cols_C1)
            CheckB_Well(rows_C1, cols_C1).Visible = True
            If rows_C1 Mod 2 = 0 Then
                CheckB_Well(rows_C1, cols_C1).Location = New Point(40 + 50 * cols_C1, 20 + 25 * (well_rows - 1 - rows_C1))
            Else
                CheckB_Well(rows_C1, cols_C1).Location = New Point(40 + 50 * (well_cols - 1 - cols_C1), 20 + 25 * (well_rows - 1 - rows_C1))
            End If
            Me.GroupBox3.Controls.Add(CheckB_Well(rows_C1, cols_C1))
        Next cols_C1
    Next rows_C1
End Sub

【问题讨论】:

  • 没有理由必须设置控件的Location。使用 TableLayoutPanel 作为容器。您只需设置适当数量的行数和列数,然后将Add 您的CheckBoxes 设置为它的Controls 集合。它将根据您的配置自动布局子控件。
  • 或者 FlowLayoutPanel 如果您只需要在向容器添加或删除控件时对齐控件(顺便说一句,要从控件集合中删除控件,请仅在您已经使用 [Container].Controls.Remove(control) 时使用处理在运行时构建的控件列表或数组,并将这些现有控件添加到容器中,否则使用control.Dispose())。当窗体关闭时,处理该集合中的控件。
  • 与您的Me.GroupBox3.Controls.Clear() 相同:使用向后的For 循环(从Me.GroupBox3.Controls.Count - 10)并在循环中的当前索引处处理控件。跨度>

标签: arrays vb.net checkbox


【解决方案1】:

您只需将AutoSize 设置为True:

CheckB_Well(rows_C1, cols_C1) = New CheckBox
CheckB_Well(rows_C1, cols_C1).AutoSize = True

因为它在偶数行上从左到右绘制,所以默认大小的额外空间覆盖了右侧的复选框。

旁注:创建二维数组Dim CheckB_Well(,) 有什么意义?这是一个局部变量,所以没有必要:

Sub Check_Panel()
    Me.GroupBox3.Controls.Clear()

    If Opt6.Checked = True Then
        well_number = 6
        well_rows = 2
        well_cols = 3
    ElseIf Opt12.Checked = True Then
        well_number = 12
        well_rows = 3
        well_cols = 4
    ElseIf Opt24.Checked = True Then
        well_number = 24
        well_rows = 4
        well_cols = 6
    End If

    For rows_C1 As Integer = 0 To well_rows - 1
        Dim Y As Integer = 20 + 25 * (well_rows - 1 - rows_C1)
        For cols_C1 As Integer = 0 To well_cols - 1
            Dim CB As New CheckBox
            CB.AutoSize = True
            CB.Name = "Well" + Str(rows_C1) + ";" + Str(cols_C1)
            CB.Text = Str(rows_C1) + ";" + Str(cols_C1)
            If rows_C1 Mod 2 = 0 Then
                CB.Location = New Point(40 + 50 * cols_C1, Y)
            Else
                CB.Location = New Point(40 + 50 * (well_cols - 1 - cols_C1), Y)
            End If
            Me.GroupBox3.Controls.Add(CB)
        Next cols_C1
    Next rows_C1
End Sub

输出:

【讨论】:

  • 非常感谢您的回答。这非常有用。
  • 如果这解决了您的问题,请点击接受按钮。如果它没有解决您的问题,请告诉我们仍然无法解决的问题...
  • 关于 Dim CheckB_Well(,) 数组,我想在附加按钮中使​​用该数组。在选中的复选框位置,我将执行另一个操作。其实我不知道有没有必要。我以前用VB6编程,VB.net中的数组确实不一样。
  • 控制阵列不再存在,但常规阵列是相同的。如果您想在不同的按钮中使用该数组,请在 FORM LEVEL 声明它,以便它可以访问。现在它只是一个 LOCAL 变量,一旦该方法完成就会消失。
  • 确保你删除了本地声明,否则它将“隐藏”表单级别的变量。如果您已经这样做了,我需要更多详细信息/代码来帮助您弄清楚。
猜你喜欢
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多