Флажок двумерный массив не работает

#arrays #vb.net #checkbox

#массивы #vb.net #флажок

Вопрос:

Я хочу создать двумерный массив для отображения флажков в строках и столбцах. Тем не менее, эта строка не работает: 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
  

Комментарии:

1. Нет причин устанавливать Location элементы управления. Используйте a TableLayoutPanel в качестве контейнера. Вы просто настраиваете соответствующее количество строк и столбцов, а затем Add CheckBoxes переходите к его Controls коллекции. Он автоматически разместит дочерние элементы управления на основе вашей конфигурации.

2. Или FlowLayoutPanel, если вам просто нужно, чтобы ваши элементы управления были выровнены при добавлении или удалении их в контейнер (кстати, чтобы удалить элемент управления из коллекции элементов управления, используйте [Container].Controls.Remove(control) только в том случае, если вы уже обрабатываете список или массив элементов управления, созданных во время выполнения, и добавляете эти существующие элементы управления в контейнер, в противном случае используйте control.Dispose() ). Удалите элемент управления в этой коллекции, когда форма закроется.

3. То же самое по отношению к вашему Me.GroupBox3.Controls.Clear() : используйте обратный For цикл (от Me.GroupBox3.Controls.Count - 1 до 0 ) и удалите элемент управления по текущему индексу в цикле.

Ответ №1:

Вам просто нужно установить AutoSize значение True:

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

Поскольку он рисовался слева направо на четных строках, дополнительное пространство от размера по умолчанию закрывало флажки справа.

Примечание: В чем смысл создания 2D-массива 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
  

Вывод:

введите описание изображения здесь

Комментарии:

1. Я очень благодарен за ваш ответ. Это было очень полезно.

2. Если это решило вашу проблему, нажмите эту кнопку «Принять». Если это не решило вашу проблему, сообщите нам, что все еще не работает…

3. Что касается массива Dim CheckB_Well(,), я хочу использовать массив в дополнительной кнопке. В выбранных положениях флажков я собираюсь выполнить другую операцию. На самом деле, я не знаю, нужно ли это. Раньше я программировал на VB6, и массивы действительно отличаются в VB.net .

4. УПРАВЛЯЮЩИХ МАССИВОВ больше не существует, но обычные массивы остались прежними. Если вы хотите использовать этот массив в другой кнопке, объявите его на УРОВНЕ ФОРМЫ, чтобы он был доступен. Прямо сейчас это просто ЛОКАЛЬНАЯ переменная, которая исчезает после завершения этого метода.

5. Убедитесь, что вы удалили локальное объявление, иначе оно «скроет» переменную уровня формы. Если вы уже это сделали, мне понадобится больше деталей / кода, чтобы помочь вам разобраться.