vb.net відключити кнопки створення runtime

Привіт всім, я створив динамічні кнопки під час виконання, і я хотів би вимкнути їх, коли користувач натискає кнопку форми.

Це код, який я маю для цієї кнопки:

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 (який я вважаю масивом рядків), використовуйте масив кнопок і додайте кожну кнопку. Тоді цикл через цей масив (як ви зробили тут) налаштування включено = 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 визначено для всієї форми, так що вона доступна для обох підписок.

3
додано
Розум, який дає мені приклад у коді?
додано Автор StealthRT, джерело
Оновлено ОР для вас :)
додано Автор StealthRT, джерело
Добре, можливо, мені потрібно включити ще кілька інформації .. Я хочу, щоб мати можливість відключити їх після їх створення. Значення після того, як вони будуть створені, користувач може робити все, що стосується форми, і якщо вони натискають кнопку форми, то це призведе до вимкнення тих кнопок у вже створеному масиві.
додано Автор StealthRT, джерело
І я також оновив свій OP, щоб показати, що його підказка викликаю, щоб створити кнопку. Він створює одну кнопку за один раз, коли вона дзвонить в цей підрозділ. Тож я не думаю, що зможу зробити масив за щось подібне.
додано Автор StealthRT, джерело
В рядку "Debug.Print (MyPictureBox.Name)" я отримую таку помилку: посилання на об'єкт не встановлено на екземпляр об'єкта.
додано Автор StealthRT, джерело
Я оновив мій OP, щоб показати свій код у ньому. У мене все-таки з'являється помилка в моєму коді.
додано Автор StealthRT, джерело
Так, я створив його, використовуючи Dim userAvatar (14) As PictureBox , який 14 - максимальна кількість кнопок, яку він створить. І я поставив це на самому верхньому поза підрозділ
додано Автор StealthRT, джерело
Добре. Я зрозумів. OP оновлено для показу. Збережено, скільки intx там було і просто циклічно, доки intXX не досягне цього :)
додано Автор 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. Ваш код повинен зробити щось подібне. Можливо, ви також захочете розглянути рішення Б. Піта щодо використання списку, а не масиву, особливо якщо кількість разів, які потрібно зберігати, періодично змінюється.
додано Автор Brian Willis, джерело
+1 Це має працювати добре. Я хотів би розглянути можливість використання списку, а не масиву, як у: Dim MyPictureBoxes = new List (з PictureBox). Потім, в коді оригінального плаката, додавши рядок: MyPictureBox.Add (personAvatar) додасть кожен елемент керування у список, оскільки він створений. Доступ до елементів керування можна отримати, використовуючи для кожного циклу, показаного у відповідь.
додано Автор B Pete, джерело
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug