Вопрос по vb.net – Цикл управления через VB.NET

2

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

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

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

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

Его winforms. И у меня нет классов для представления состояния игры. Его контролирует массив. Rohit Shinde
WinForms? WPF? ASP.NET? Michael Liu
У вас есть классы моделей для представления игрового состояния и игрового поля отдельно от логики и элементов управления дисплея? Если нет, вы должны. mellamokb

Ваш Ответ

4   ответа
0

Это довольно просто и может потребовать значительных ресурсов, но это работает. У меня есть форма с 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
4

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

В вашем случае у вас есть только 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 Shinde
@Rohit Это не очень специфично. Вы, вероятно, пытались установитьLocation.X а такжеLocation.Y отдельно, это не работает. Назначьте этоPointили установитьTop а такжеLeft по отдельности. Это не даст ошибку.
Ага. Я последую этому совету! Спасибо!! Но еще одна вещь, если в этом случае я должен получить доступ к картинке, я просто говорю, шахматное поле (i, j) .BackColor = Color.Black? Rohit Shinde
@Rohit Точно.
+1. Поднимитесь на более продвинутый уровень программирования & amp; следуй этому совету.
1

Поместите все картинки в 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 и т. Д.).

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

Переберите 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
Исключением является то, что system.windows.form.button не может быть преобразован в system.windows.form.picturebox Rohit Shinde
@RohitShinde Что является исключением
это дает мне исключение, когда я пробую это. Rohit Shinde
@RohitShinde См. Редактировать, это было сбой на элементах управления не Picturebox.
Это помогает, но в моей программе выделены возможные квадраты, которые может перемещать фигура. Поэтому после перемещения части к одному из них я хочу вернуть их исходному цвету, который будет либо черным, либо белым. Поэтому я действительно не могу проверить задний цвет графических блоков. Так какое-нибудь другое решение? Rohit Shinde

Похожие вопросы