2014-12-23 2 views
0

Я использовал для программирования в VB6 и пытаюсь написать ту же программу в VB 2013. В этой программе я использую массив из 49 кнопок, которые все делают то же самое, когда вы нажимаете на них. Я понял, что нужно сделать функцию щелчка до точки:создать массив существующих кнопок vb 2013

Private Sub Button_Click(sender As Object, e As EventArgs) Handles Button9.Click, Button10.Click, Button11.Click, Button12.Click, Button13.Click, Button16.Click, Button17.Click, Button18.Click, Button19.Click, Button20.Click 
    ... 

End Sub 

То, что я пытаюсь сделать, это упрощает код вниз, используя массив, так что я могу просто пройти по индексу. Еще один человек задал тот же самый вопрос в 2010 году и лучший ответ был:

Button[] array = { firstButton, secondButton }; 

Это будет работать, но я хочу что-то с меньшей типизацией. Я также попытался следующие с отказом:

Один

Button[] buttons = this.Controls.OfType<Button>().ToArray(); 

Два

For i = 1 To 100 
    Dim btns() As Button = Controls.Find("Button" & i, True) 
    Dim btn As Button 
    If btns IsNot Nothing Then 
    btn = btns(0) 
    'If buttons Is Nothing Then 
    ' ReDim buttons(0) 
    'Else 
    ' ReDim Preserve buttons(buttons.Length) 
    'End If 
    'buttons(UBound(buttons)) = btn 
    btn.Text = i - 1 'here you can change whatever you want 
    End If 
Next 

Три

Dim buttons() As Button 

buttons = Nothing 
For Each b As Button In Me.Controls 
If buttons Is Nothing Then 
    ReDim buttons(0) 
Else 
    ReDim Preserve buttons(buttons.Length) 
End If 
buttons(UBound(buttons)) = b 
Next 

Я просто не могу заставить его принять существующие кнопки в массив. Я надеюсь, что кто-то может помочь.

+0

Вы должны использовать 'List (Of Button)'. – SLaks

+1

Ни массив, ни список не помогут вам. VB.NET не похож на VB6. Если вы хотите «49 кнопок, которые все делают одно и то же», используйте общий обработчик событий. – Plutonix

+0

Обычный обработчик событий - это то, что я начал делать в самом начале. Верный? –

ответ

0

Вариант два будет работать, вам просто нужно добавить кнопку, найденную в списке. Я предлагаю вам добавить свои кнопки в список (Of) вместо массива. Вы всегда можете преобразовать список в массив, если вам действительно нужно.

Dim buttonList As New List(Of Button) 

    For i As Integer = 1 To 100 
     Dim btns() As Control = Controls.Find("Button" & i, True) 

     If btns IsNot Nothing AndAlso btns.Length > 0 Then 
      buttonList.Add(CType(btns(0), Button)) 
     End If 
    Next 
+0

Я просто использовал ваш код и получил ошибку. Ошибка: «Элементы управления» не объявлены. Не уверен, имеет значение, но я использую Visual Studio 2013 Express? –

+0

@ DuckyDarkling [Controls] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controls (v = vs.110) .aspx) является свойством формы. Если вы выполняете это за пределами формы, вам нужно будет правильно передать свою форму. –

+1

Я сделал небольшую модификацию кода, и теперь он работает. Теперь я могу получить свой индекс от нажатой кнопки, а затем изменить эту кнопку и другие в списке. Благодаря тонну. –

1

Если Button s вкладываются управления контейнера (например, GroupBox), то вам нужно будет выполнить рекурсивный поиск для всех кнопок. Может быть, что-то вроде этого (полностью неоптимизированная) ...

Private Function FindAllButtons(root As Control) As List(Of Button) 
    Dim result As List(Of Button) = New List(Of Button)() 
    For Each c As Control In root.Controls 
     If TypeOf c Is Button Then 
      result.Add(DirectCast(c, Button)) 
     ElseIf c.HasChildren Then 
      result.AddRange(FindAllButtons(c)) 
     End If 
    Next 
    Return result 
End Function 

Тогда просто позвонить, что в вашем Form:

Dim allButtons as List(Of Button) = FindAllButtons(Me) 
' Add common Click handler 
For Each b As Button In allButtons 
    AddHandler b.Click, AddressOf Button_Click 
Next 

Update Просто для удовольствия, вот общий вариант, чтобы найти другие типы контроля.

Private Function FindAllControls(Of T As Control)(root As Control) As List(Of T) 
    Dim result As List(Of T) = New List(Of T)() 
    For Each c As Control In root.Controls 
     If TypeOf c Is T Then 
      result.Add(DirectCast(c, T)) 
     ElseIf c.HasChildren Then 
      result.AddRange(FindAllControls(Of T)(c)) 
     End If 
    Next 
    Return result 
End Function 

Вы можете использовать это как:

Dim allButtons As List(Of Button) = FindAllControls(Of Button)(Me) 
Dim allTextBoxes As List(Of TextBox) = FindAllControls(Of TextBox)(Me)