3

Visual Basic 2010 フォーム アプリケーションには、次のコード スニペットがあります。

For Each ctlControl In Me.Panel1.Controls
    If TypeName(ctlControl) = "PictureBox" Then
        ctlControl.image = Nothing
    End If
Next ctlControl

私の問題は、コントロールをループすると、左上のコントロールから始まらず、各画像ボックスをランダムな順序で通過するように見えることです。

次に更新されるピクチャ ボックスの順序を制御するにはどうすればよいですか。ループによって画像ボックスが更新される順序を制御するために操作できるタブ インデックス (VB 6) に似たプロパティはありますか?

4

4 に答える 4

2

より適切で確実な方法として、各画像ボックスを取得し、それらのハンドルと場所を保持してから、それらの場所に従って並べ替えます。これで、使用する準備が整いました。次に例を示します。

Public Class Form1
    Structure Pbox
        Dim handle As IntPtr
        Dim top As Integer
        Dim left As Integer
    End Structure
    Dim pboxlist As New List(Of Pbox)
    Sub ClearImages()
        pboxlist.Clear()
        For Each c As Control In Me.Controls
            If TypeName(c) = "PictureBox" Then
                Dim x As New Pbox
                x.top = c.Top
                x.left = c.Left
                x.handle = c.Handle
            End If
        Next
        pboxlist.OrderByDescending(Function(a) a.top).ThenByDescending(Function(a) a.left)
        For Each item In pboxlist
            Dim x As PictureBox = PictureBox.FromHandle(item.handle)
            x.Image = Nothing
        Next
    End Sub
End Class

もう 1 つの方法は、名前を使用して並べ替えることができるように、適切な名前を付けることです。たとえば、並べ替えると、PictureBox1 が PictureBox2 の前に表示されます。したがって、一番上と左のものには PictureBox1 を使用し、次のものには PictureBox2 を使用する必要があります...

編集: John Bustos が提案したように、名前の代わりに Tag プロパティを使用することは、より簡単でより良いアイデアです。そのため、名前に迷うことなく、自分で定義したタグに従ってピクチャ ボックスを並べ替えることができます。

于 2013-01-02T22:18:32.550 に答える
0

他の人の何人かが言ったように、おそらく最良のショットである TAG プロパティを使用できると言っているように、画像ボックスを動的に作成するときはカウンターを使用し、カウンター値を TAG プロパティに追加します。画像ボックスを手動で追加した場合は、左上から始めて右に向かって作業し、それぞれの TAG プロパティ フィールドに値を 1 から始めて 1 ずつ増やして追加し、行が完了するまで続けます。次の行で。

最後に、画像ボックスをループする準備ができたら、以下のパターンに従ってください..

'Calc number of picture boxes
For Each ctlControl In Me.Panel1.Controls
  If TypeName(ctlControl) = "PictureBox" Then
    Counter = Counter + 1
  End If
Next ctlControl
ThisBox = 1
Do
  For Each ctlControl In Me.Panel1.Controls
    If TypeName(ctlControl) = "PictureBox" Then
      If CInt(ctlControl.Tag) = ThisBox Then 
        CLEAR-YOUR-IMAGE-HERE
        ThisBox = ThisBox + 1
      End If
    End If
  Next ctlControl
Loop Until ThisBox = Counter

注: TAG プロパティに配置する番号は連続していないと、DO-LOOP で永遠に動けなくなります!!!

于 2013-01-03T07:32:04.240 に答える
0

PictureBox コントロールには、Tag の代わりに使用できる Text プロパティがあります。

インフラストラクチャ プロパティであるため、Intellisense には表示されませんが、存在します。

http://msdn.microsoft.com/en-us/library/hc9k45f4(v=vs.110).aspx

(ザフ・カーンの答えにコメントしたかったのですが、まだ担当者がいません。)

于 2014-10-28T02:11:19.293 に答える
0

コントロールの順序は、タブストップ インデックスではなく、パネルに追加された順序によって決まりました。フォームのデザイナー ファイルでパネルに追加された順序を慎重に再編成することで、これを変更できますが、お勧めしません。

于 2013-01-02T22:14:30.887 に答える