vb.netランタイムで作成されたボタンを無効にする

ちょっと、私は実行時に動的なボタンを作成し、ユーザーがフォームボタンをクリックしたときにそれらを無効にしたいと思います。

これは私がそのボタンに持っているコードです:

Dim intXX As Integer = 0

Do Until intXX = intX
    userAvatar(intXX).Enabled = False
    intXX = intXX + 1
Loop

buttonNamesは、実行時に作成されたすべての読み込まれたボタン名の配列です。ただし、その終わりに.enabled = falseを試行しても機能しません。実行時に作成されるボタンでこれを行うには他にどのような方法がありますか?

私はどのようにボタンをこのように作成する:

private sub createButton()
Dim personAvatar As New PictureBox

With personAvatar 
        .AutoSize = False                        '>                        ^

        If intX = 7 Then
            thePrviousAvatarImg = 0
        End If

        If intX <= 6 Then
            .Location = New System.Drawing.Point(10 + thePrviousAvatarImg, 10)
        ElseIf intX >= 7 And intX <= 14 Then
            .Location = New System.Drawing.Point(10 + thePrviousAvatarImg, 150)
        Else
            Exit Sub
        End If

        .Name = "cmd" & nameOfPerson
        .Size = New System.Drawing.Size(100, 100)
        .TabStop = False
        .Text = ""
        .BorderStyle = BorderStyle.FixedSingle
        .BackgroundImageLayout = ImageLayout.Center
        .BackColor = Color.LightGray
        .BackgroundImage = Image.FromFile(theAvatarDir)
        .Tag = nameOfPerson
        .BringToFront()
    End With

    AddHandler personAvatar.Click, AddressOf personAvatar_Click
    Me.Controls.Add(personAvatar)
    userAvatar(intX) = personAvatar
    intX = intX + 1
End With
End Sub

あなたの時間と助けてくれてありがとう!

デビッド

0

1 答え

名前の文字列表現を使用してボタンオブジェクトを参照することはできません。 buttonNames (文字列の配列)を使用する代わりに、ボタンの配列を使用して各ボタンを追加します。次に、その配列をループします(ここで行ったように)。

したがって、各ピクチャボックスを作成する前に、それらを格納する配列を宣言します。

Dim MyPictureBoxes() as PictureBox

次に、それぞれを作成するときに、配列に追加します。作成が完了したら、次のように無効にすることができます:

For Each MyPictureBox In MyPictureBoxes
    Debug.Print(MyPictureBox.Name)
    MyPictureBox.enabled = False
Next

私はcmdGoとcmdDisableという2つのボタンを持つフォームを作成し、これをより完全に説明しています:

Public Class Form1
    Dim MyPictureBoxes(4) As PictureBox

    Private Sub cmdGo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdGo.Click
        Dim personAvatar As New PictureBox
        Dim intX As Integer = 0

        While intX < 5
            personAvatar = New PictureBox
            With personAvatar
                .AutoSize = False
                .Left = intX * 100
                .Top = 100
                .Name = "cmd" & intX
                .Size = New System.Drawing.Size(100, 100)
                .TabStop = False
                .Text = ""
                .BorderStyle = BorderStyle.FixedSingle
                .BackgroundImageLayout = ImageLayout.Center
                .BackColor = Color.LightGray
                .BringToFront()
            End With

            Me.Controls.Add(personAvatar)
            MyPictureBoxes(intX) = personAvatar
            intX = intX + 1
        End While
    End Sub

    Private Sub cmdDisable_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDisable.Click
        For Each MyPictureBox In MyPictureBoxes
            Debug.Print(MyPictureBox.Name)
            MyPictureBox.Enabled = False
        Next
    End Sub
End Class

MyPictureBoxes がフォーム全体でどのようにスコープされているので、両方のサブスレッドからアクセスできるようになっていることに注目してください。

3
追加された
私にコードの例を教えてくれますか?
追加された 著者 StealthRT,
あなたのために更新されたOP :)
追加された 著者 StealthRT,
さて、私はいくつかの情報を追加する必要があります。私はそれらが作成された後に無効にすることができるようにしたい。つまり、フォームを作成した後、ユーザーはフォーム上の任意の操作を行うことができ、フォームボタンを押すと、すでに作成されている配列のボタンが無効になります。
追加された 著者 StealthRT,
そして、私はボタンを作成するためにサブを呼び出していることを示すためにOPを更新しました。それはそのサブに呼び出されるたびに、一度に1つのボタンを作成します。だから私はそれのようなものの配列を行うことはできないと思う。
追加された 著者 StealthRT,
"Debug.Print(MyPictureBox.Name)"という行に次のエラーが表示されます。オブジェクト参照がオブジェクトのインスタンスに設定されていません。
追加された 著者 StealthRT,
あなたのコードを表示するようにOPを更新しました。それでも私のコードでエラーが発生します。
追加された 著者 StealthRT,
はい、私は Dim userAvatar(14)As PictureBox を使用して作成しました。これは作成するボタンの最大数です。そして、私はそれをサブの非常に上のに置きました
追加された 著者 StealthRT,
はい、分かりました。 OPが更新されて表示されます。 intX がそれに達するまで、いくつの intX が保存され、ループされました:
追加された 著者 StealthRT,
@StealthRT質問にボタンを生成するコードを追加してください。これは私の答えに役立ちます。
追加された 著者 Brian Willis,
@StealthRT私の答えを更新しました。それが実際に私の最後で動作することを確認する秒を与えます。
追加された 著者 Brian Willis,
@StealthRTは配列がサブフォームではなくフォームのスコープ内にあることを宣言するだけです。私はあなたにもっと完全な解決策を与えるために私の答えを変えました。
追加された 著者 Brian Willis,
@StealthRT [cmdGo]ボタンをクリックして画像ボックスを作成し、cmdDisableをクリックして無効にします。 cmdDisableを最初にクリックすると、動作しません。それは実際に私が投稿したコードの大きな部分ではありません、あなたの理解に役立つだけです。
追加された 著者 Brian Willis,
@StealthRT私はあなたが何が起こっているのか理解せずにコピー/ペーストしていることを心配しています。これは良いものよりも害を及ぼすでしょう。私がしたのと同じ方法でuserAvatarを宣言し、作成しているすべてのPictureBoxを保持するのに十分な余地があることを確認してください。私のコードが何をしているのか理解していますか?
追加された 著者 Brian Willis,
@StealthRTあなたのサブの実行中にIntXが0から13までインクリメントされますか?そうでなければ、そのエラーの原因となるuserAvatarに空のスロットがあります。私のコードでどのように0から4までインクリメントするかを見てください。あなたのコードは何か似たようなことをする必要があります。配列の代わりにリストを使用するB Peteのソリューションを検討したい場合もあります。特に、ピクチャボックスの数が時々変更を保存しなければならない場合は特にそうです。
追加された 著者 Brian Willis,
+1これはうまくいくはずです。 Dim MyPictureBoxes = new List(Of PictureBox)のように、配列の代わりにListを使うことを考えます。次に、元のポスターのコードで、MyPictureBox.Add(personAvatar)という行を追加すると、各コントロールが作成されたときにリストに追加されます。あなたの答えに表示されているFor Eachループを使ってコントロールにアクセスすることができます。
追加された 著者 B Pete,