vb.net çalışma zamanı oluşturulan düğmeleri devre dışı bırak

Hey tüm çalışma zamanında dinamik düğmeler oluşturdum ve bir kullanıcı bir form düğmesine tıkladığında bunları devre dışı bırakmak istiyorum.

Bu düğme için sahip olduğum kod:

Dim intXX As Integer = 0

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

ButtonNames, çalışma zamanında oluşturulan tüm doldurulmuş düğme adlarının bir dizisidir. Ancak, bunun sonunda .enabled = false denemesi işe yaramaz. Çalışma zamanında oluşturulan düğmelerle bunu yapmanın başka yolları var mı?

Düğmeleri nasıl oluştururum:

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

Zaman ayırdığınız ve yardım ettiğiniz için teşekkürler!

David

0

1 cevap

Düğme nesnelerine isimlerinin dize gösterimini kullanarak başvuramazsınız. buttonNames (bir dizi dizesi olduğunu farz ediyorum) kullanmak yerine, bir düğme dizisi kullanın ve her düğmeyi buna ekleyin. Ardından, bu dizi boyunca döngü yapın (burada yaptığınız gibi) ayar etkin = her biri için yanlış.

Bu nedenle, her resim kutusunu oluşturmadan önce, onları depolamak için bir dizi bildirin:

Dim MyPictureBoxes() as PictureBox

Sonra her birini oluştururken diziye ekleyin. Onları yaratmayı tamamladığınızda, onları şu şekilde devre dışı bırakabilirsiniz:

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

Bunu daha iyi göstermek için cmdGo ve cmdDisable iki düğmeli bir form oluşturdum:

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

Formun tamamı için MyPictureBoxes öğesinin kapsamının ne olduğuna dikkat edin, böylece her iki alt için de erişilebilir.

3
katma
Bana kodda bir örnek verebilir misin?
katma yazar StealthRT, kaynak
OP sizin için güncellendi :)
katma yazar StealthRT, kaynak
Tamam belki biraz daha fazla bilgi eklemeliyim .. Oluşturulduktan sonra onları devre dışı bırakmak istiyorum. Yani, kullanıcılar oluşturulduktan sonra formdaki her şeyi yapabilir ve bir form düğmesine basarlarsa, dizideki düğmeleri zaten oluşturulmuş olur.
katma yazar StealthRT, kaynak
Ve ayrıca bir alt oluşturmak için bir alt oluşturduğumu göstermek için OP'imi güncelledik. Her seferinde o subayı aradığında bir düğme oluşturur. Bu yüzden böyle bir şey için dizi yapabileceğimi sanmıyorum.
katma yazar StealthRT, kaynak
"Debug.Print (MyPictureBox.Name)" satırında aşağıdaki hatayı alıyorum: Nesne başvurusu bir nesnenin örneğine ayarlanmadı.
katma yazar StealthRT, kaynak
kodumu göstermesi için OP’mi güncelledim. Yine de kodumdaki hatayı al.
katma yazar StealthRT, kaynak
evet, bunu Dim userAvatar (14) PictureBox As kullanarak yaratacağım 14 sayı olacak. Ve ben bunu en alttaki dışardan en alt noktaya koydum.
katma yazar StealthRT, kaynak
Tamam anladım. OP gösterilecek şekilde güncellendi. Kaç tane intX vardı ve intXX bu alana ulaşana kadar sadece ilmekledi :)
katma yazar StealthRT, kaynak
@StealthRT Sorunuza düğmeleri oluşturduğunuz ve yanıtlamama yardımcı olacak kodu ekleyin.
katma yazar Brian Willis, kaynak
@StealthRT Cevabımı güncelledi, bana gerçekten işin bitip bitmediğini kontrol etmek için bir saniye verin.
katma yazar Brian Willis, kaynak
@StealthRT, dizinin alt değil, formun kapsamı içinde olduğunu bildirir. Size daha eksiksiz bir çözüm sunmak için cevabımı değiştirdim.
katma yazar Brian Willis, kaynak
@ StealthRT Resim kutuları oluşturmak için cmdGo düğmesine tıklayın, ardından devre dışı bırakmak için cmdDisable öğesine tıklayın. Eğer cmdDisable'a tıklarsanız önce işe yaramaz. Bu benim gönderdiğim harika bir kod değil, anlamanıza yardım etmek için var.
katma yazar Brian Willis, kaynak
@StealthRT Neler olup bittiğini anlamadan kopyalayıp yapıştırdığınız için endişeliyim, ki bu durum iyiden daha fazla zarar verecek. UserAvatar'ı benim yaptığım gibi ilan ettiğinizden emin olun ve oluşturduğunuz tüm PictureBox'ları tutacak yeterli alan bulunduğundan emin olun. Kodumun ne yaptığını anlıyor musunuz?
katma yazar Brian Willis, kaynak
@StealthRT IntX, alt grubunuzun çalışması sırasında 0'dan 13'e yükseliyor mu? Aksi takdirde, userAvatar'da bu hataya neden olacak boş yuvalar olacaktır. Kodumda 0'dan 4'e nasıl çıktığını görün. Kodunuzun benzer bir şey yapması gerekir. Ayrıca B Pete’in bir dizi yerine bir List kullanma çözümünü de düşünebilirsiniz, özellikle saklamak zorunda olduğunuz PictureBox’lar zaman zaman değişiyorsa.
katma yazar Brian Willis, kaynak
+1 Bu iyi çalışmalı. Bir dizi yerine bir Listeyi kullanmayı düşünürdüm, şöyle: Dim MyPictureBoxes = new List (Of PictureBox). Ardından, orijinal posterin kodunda, şu satırı eklemek: MyPictureBox.Add (personAvatar), oluşturulan her bir listeyi listeye ekler. Kontrollere hala cevabınızda gösterilen Her bir döngü için erişilebilir.
katma yazar B Pete, kaynak