Цикл управления через VB.NET

Я создаю шахматную программу. И он состоит из шестидесяти четырех картинных коробок с чередующимися черными и белыми цветами фона.
Я назвал ихpba1, pba2, pbb1, pbb2, pbc1 и так далее.
Теперь я хочу перебрать только чёрные, например, я хочу перебрать только pba1, pbb2, pbc3 и так далее.
Как создать цикл для этого в VB.NET?

Я знаю способ обхода элементов управления с одинаковыми именами, но я не могу адаптировать этот метод для своей проблемы. Можете ли вы сказать мне решение?

РЕДАКТИРОВАТЬ: В pba1, pb обозначает окно изображения, а a1 обозначает квадрат. На всякий случай, вы удивляетесь, почему такое имя.

РЕДАКТИРОВАТЬ: Проверьте этоответ

 Rohit Shinde23 июн. 2012 г., 11:24
Его winforms. И у меня нет классов для представления состояния игры. Его контролирует массив.
 mellamokb23 июн. 2012 г., 04:39
У вас есть классы моделей для представления игрового состояния и игрового поля отдельно от логики и элементов управления дисплея? Если нет, вы должны.
 Michael Liu23 июн. 2012 г., 04:33
WinForms? WPF? ASP.NET?

Ответы на вопрос(4)

Это довольно просто и может потребовать значительных ресурсов, но это работает. У меня есть форма с 36 флажками. Это использует тот факт, что когда вы копируете чекбокс, он просто увеличивает номер имени. Я закончил с 36 флажками с именем CheckBox1 через Checkbox36. Функция возвращает флажок, который может использоваться для установки или чтения любого свойства.

Private Function GetCheckBox(ByVal Index As Integer) As CheckBox
    Dim CKBox As checkbox
    For Each cntrl As Control In Me.Controls
        If TypeOf cntrl Is CheckBox Then
            CKBox = cntrl
            If CKBox.Name = "CheckBox" & Index Then
                Exit For
            End If
        End If
    Next
    Return ckbox
End Function
Решение Вопроса

Генерация элементов управления во время разработки с помощью конструктора форм имеет смысл только для макетов, которые выигрывают от дизайнера форм.

В вашем случае у вас есть только 64 одинаковых блока в 8 строках из 8. Не используйте для этого конструктор форм, создайте элементы управления во время выполнения и не называйте их такими именами, какpba1просто поместите их в соответствующую структуру данных (например, массив 8x8):

Private chessFields As PictureBox(8, 8)

' In Form_Load:
For i = 0 To 7
    For j = 0 To 7
        chessFields(i, j) = New PictureBox
        ' Set size, position … then, finally,
        Controls.Add(chessFields(i, j))
    Next
Next

Таким образом, вы можете получить доступ к полям упорядоченным образом без необходимости проходить черезForm.Controls коллекция.

 Rohit Shinde23 июн. 2012 г., 14:22
Хммм. Хорошая идея :)
 23 июн. 2012 г., 13:32
@Rohit Точно.
 Rohit Shinde23 июн. 2012 г., 13:01
Ага. Я последую этому совету! Спасибо!! Но еще одна вещь, если в этом случае я должен получить доступ к картинке, я просто говорю, шахматное поле (i, j) .BackColor = Color.Black?
 23 июн. 2012 г., 12:52
+1. Поднимитесь на более продвинутый уровень программирования & amp; следуй этому совету.
 23 июн. 2012 г., 19:33
@Rohit Это не очень специфично. Вы, вероятно, пытались установитьLocation.X а такжеLocation.Y отдельно, это не работает. Назначьте этоPointили установитьTop а такжеLeft по отдельности. Это не даст ошибку.

Переберите PictureBox в вашей ControlCollection и проверьте BackColor. Я использовал ControlCollection формы, если они используются в каком-либо другом типе элемента управления контейнером.

For Each cntrl As Control In Me.Controls
    If TypeOf cntrl Is PictureBox Then
        If cntrl.BackColor = Color.Black Then
            'Do Something
        End If
    End If
Next

Основываясь на дополнительной информации, которую вы указали в своем ответе, причина, по которой ваш пример не работает, заключается в том, что имя элемента управления является строкой, и вы сравниваете его с элементом управления PictureBox, а не с именем элемента управления.

Вы можете попробовать использоватьTag Собственность вместоName Управления, он будет чище и легче для чтения. Я просто поместил 1 в свойство тега PictureBox для черного и 0 для белого.

Private Sub OriginalColour()               
    For Each cntrl As Control In Me.Controls
        Dim result As Integer
        If TypeOf cntrl Is PictureBox Then
            If Integer.TryParse(cntrl.Tag.ToString, result) Then
                If result = 1 Then
                    cntrl.BackColor = Color.Gray
                Else
                    cntrl.BackColor = Color.White
                End If
            End If

        End If
    Next
End Sub
 Rohit Shinde23 июн. 2012 г., 16:15
это дает мне исключение, когда я пробую это.
 23 июн. 2012 г., 16:21
@RohitShinde Что является исключением
 Rohit Shinde23 июн. 2012 г., 16:42
Исключением является то, что system.windows.form.button не может быть преобразован в system.windows.form.picturebox
 Rohit Shinde23 июн. 2012 г., 11:33
Это помогает, но в моей программе выделены возможные квадраты, которые может перемещать фигура. Поэтому после перемещения части к одному из них я хочу вернуть их исходному цвету, который будет либо черным, либо белым. Поэтому я действительно не могу проверить задний цвет графических блоков. Так какое-нибудь другое решение?
 23 июн. 2012 г., 16:32
@RohitShinde См. Редактировать, это было сбой на элементах управления не Picturebox.

Поместите все картинки в 8x8 tableLayoutPanel (также полезно для масштабирования и т. Д.). затем

    For Each pb As PictureBox In TableLayoutPanel1.Controls
        Dim col As Integer = TableLayoutPanel1.GetCellPosition(pb).Column
        Dim row As Integer = TableLayoutPanel1.GetCellPosition(pb).Row
        If col Mod 2 = 0 Xor row Mod 2 = 0 Then
            pb.BackColor = Color.Black
        Else
            pb.BackColor = Color.White
        End If
    Next

Конечно, вы также можете использовать массив квадратов, если он у вас есть.

Это не повлияет на события (pba1.click и т. Д.).

 Rohit Shinde23 июн. 2012 г., 16:58
Повлияет ли это на мои события кликов, которые я уже закодировал? Я имею в виду, я уже написал код для всех графических блоков. Так что, если я помещу свои графические блоки в tableLayoutPanel, это повлияет на код или его функционирование? & # X2013;

Ваш ответ на вопрос