2

私はチェスプログラムを作成しています。そして、それは黒と白の背景色が交互になった 64 個の画像ボックスで構成されています。、、、などの
名前を付けました。 ここで、黒いものだけをループしたいと思います。たとえば、pba1、pbb2、pbc3 などだけをループしたいと思います。 VB.NET でこのループを作成するにはどうすればよいですか? pba1pba2pbb1pbb2pbc1

同様の名前のコントロールをループする方法は知っていますが、その方法を問題に適応させることはできません。解決策を教えていただけますか?

編集: pba1 では、pb は画像ボックスを表し、a1 は正方形を表します。念のため、なぜそのような名前なのか疑問に思います。

編集:この回答をチェックしてください

4

4 に答える 4

6

ControlCollection の PictureBox をループして、BackColor をテストします。Form の 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、よりクリーンで読みやすくなります。PictureBox のタグ プロパティに、黒の場合は 1 を、白の場合は 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
于 2012-06-23T03:15:50.893 に答える
4

フォーム デザイナを介してデザイン時にコントロールを生成することは、フォーム デザイナの恩恵を受けるレイアウトに対してのみ意味があります。

あなたの場合、8行8列に64個の均一なボックスがあります。これにはフォームデザイナーを使用せず、実行時にコントロールを作成し、のような名前を付けず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そうすれば、コレクションを経由しなくても、整然とした方法でフィールドにアクセスできます。

于 2012-06-23T10:06:11.017 に答える
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 など) には影響しません。

于 2012-06-23T09:56:59.927 に答える
0

これはかなり単純で、リソースが重いかもしれませんが、うまくいきます。36個のチェックボックスを持つフォームがあります。これは、チェックボックスをコピーすると、名前の数が増えるだけであるという事実を利用しています。CheckBox1 から Checkbox36 という名前の 36 個のチェックボックスができました。この関数は、任意のプロパティの設定または読み取りに使用できるチェックボックスを返します。

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
于 2015-02-10T19:26:21.073 に答える