vb.net отключить кнопки, созданные во время выполнения - PullRequest
0 голосов
/ 28 октября 2011

Привет всем, я создал динамические кнопки во время выполнения, и я хотел бы отключить их, когда пользователь нажимает кнопку формы.

Вот код, который у меня есть для этой кнопки:

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

Спасибо за ваше время и помощь!

David

1 Ответ

3 голосов
/ 28 октября 2011

Вы не можете ссылаться на объекты кнопок, используя строковое представление их имен. Вместо использования buttonNames (который я предполагаю, это массив строк), используйте массив кнопок и добавьте к ним каждую кнопку. Затем выполните цикл по этому массиву (как вы сделали здесь), установив флажок enable = false для каждого из них.

Поэтому перед созданием каждого графического блока объявите массив для их хранения:

Dim MyPictureBoxes() as PictureBox

Затем при создании каждого из них добавьте их в массив. Когда вы закончите создавать их, вы можете отключить их следующим образом:

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

Я создал форму с двумя кнопками, cmdGo и cmdDisable, чтобы продемонстрировать это более полно:

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 ограничен для всей формы, так что он доступен для обеих подпрограмм.

...