none
Установка свойств для множества однотипных элементов формы RRS feed

  • Вопрос

  • Добрый день. У меня такая проблема. На форме есть два десятка кнопок button1, button2 ... button20.

    Мне требуется установить для всех их одно и тоже свойство. Можно ли это сделать с помощью цикла, типа такого:

    for me.i=1 to 20

    button i .visible=false - в этой строке и вопрос, как правильно сослаться на  i кнопку

    next

    26 января 2011 г. 13:30

Ответы

  • Конечно, можно! :)

    Пример для Windows Forms:

    For i As Integer = 1 To 20
      Me.Controls("Button" & i).Visible = False
    Next
    
    

    • Помечено в качестве ответа Konstantin-NVKZ 26 января 2011 г. 18:21
    26 января 2011 г. 13:48
  • Вот пример, как это можно сделать, кнопки расположены в groupBox
    Public Class Form1
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For i As Integer = 1 To 4
          AddHandler GroupBox1.Controls("Button" & i).Click, AddressOf Button_Click
        Next
      End Sub
    
      Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim button As Button = DirectCast(sender, Button)
        MessageBox.Show("Hello from " & button.Name)
      End Sub
    End Class
    
    

    Для связи [mail]
    • Помечено в качестве ответа Konstantin-NVKZ 26 января 2011 г. 18:21
    26 января 2011 г. 16:41

Все ответы

  • Конечно, можно! :)

    Пример для Windows Forms:

    For i As Integer = 1 To 20
      Me.Controls("Button" & i).Visible = False
    Next
    
    

    • Помечено в качестве ответа Konstantin-NVKZ 26 января 2011 г. 18:21
    26 января 2011 г. 13:48
  • Пишет ошибку "В экземпляре объекта не задана ссылка на объект." ссылаясь на строку me.controls...

    26 января 2011 г. 14:24
  • А Me - это форма?

    Для тестирования попробуйте создать пустой проект с одной формой, добавьте на нее 20 кнопок, а вышеприведенный код поместите в обработчик Form_Load.

    26 января 2011 г. 14:41
  • Также, в качестве варианта, на форме может не быть 20 кнопок или как минимум одна из кнопок названа не по формату ButtonN, где N - это число от 1 до 20. Если Вам нужна итерация по типу элементов, а не по их именам сообщите об этом — я изменю код примера.
    26 января 2011 г. 14:43
  • Для тестирования попробуйте создать пустой проект с одной формой, добавьте на нее 20 кнопок, а вышеприведенный код поместите в обработчик Form_Load.


    Тестирование прошло успешно. И в обработчике Form_Load и в других обработчиках свойства меняются.
    26 января 2011 г. 14:47
  • Также, в качестве варианта, на форме может не быть 20 кнопок или как минимум одна из кнопок названа не по формату ButtonN, где N - это число от 1 до 20. Если Вам нужна итерация по типу элементов, а не по их именам сообщите об этом — я изменю код примера.

    Все кнопки названы по формату ButtonN. Если можно приведите пример по типу элементов.
    26 января 2011 г. 14:52
  • В таком случае уточняющие вопросы:

    • Из какого класса Вам нужно изменять свойства элементов: из класса формы, на которой расположены эти элементы, или из другого класса?
    • По каким критериям будут выбираться элементы для изменения? Возможно, Вам нужно изменить/скрыть все кнопки, находящиеся на форме (в этом случае выбор будет по типу элемента)?
    26 января 2011 г. 14:53
  • Знаете сейчас все получилось - оказалось, что кнопки находились внутри контейнера ГрупБокс - и я не мог к ним обращаться. Когда я их вынес за пределы контейнера - все сразу заработало.

    Можно еще маленький вопросик -

    Есть обработчик события нажатия кнопки "

    Private

     

    Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    "

    Можно ли его сделать универсальным для всех 20 кнопок. То есть нажимаешь кнопку - он определяет номер нажатой кнопки и передает этот номер в переменную например q. Чтобы не писать обработчики событий для каждой кнопки в отдельности. А то у меня программа будет возможно содержать до 200 кнопок в перспективе, а это здорово уменьшило бы код.

    26 января 2011 г. 15:01
  • Вот пример, как это можно сделать, кнопки расположены в groupBox
    Public Class Form1
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For i As Integer = 1 To 4
          AddHandler GroupBox1.Controls("Button" & i).Click, AddressOf Button_Click
        Next
      End Sub
    
      Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim button As Button = DirectCast(sender, Button)
        MessageBox.Show("Hello from " & button.Name)
      End Sub
    End Class
    
    

    Для связи [mail]
    • Помечено в качестве ответа Konstantin-NVKZ 26 января 2011 г. 18:21
    26 января 2011 г. 16:41
  • Большое спасибо за ответы подробные.

    26 января 2011 г. 17:15