#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
элементы управления. Используйте aTableLayoutPanel
в качестве контейнера. Вы просто настраиваете соответствующее количество строк и столбцов, а затем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. Убедитесь, что вы удалили локальное объявление, иначе оно «скроет» переменную уровня формы. Если вы уже это сделали, мне понадобится больше деталей / кода, чтобы помочь вам разобраться.