2014-12-23 3 views
0

VB6에서 프로그램을 작성하고 VB 2013에서 동일한 프로그램을 작성하려고합니다.이 프로그램에서 사용자가 클릭 할 때 동일한 작업을 수행하는 49 개의 단추 배열을 사용합니다. 내가 알아 낸 점에 클릭 기능을 할 필요가있다 :기존 단추의 배열 만들기 VB20

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

당신은'(버튼)를'목록을 사용해야합니다. – SLaks

+1

배열이나 List 모두 도움이되지 않습니다. VB.NET은 VB6과 다릅니다. 만약 당신이 원하는 것은'49 버튼이 모두 똑같은 것을한다. '라는 공통 이벤트 핸들러를 사용하는 것이다. – Plutonix

+0

공통 이벤트 처리기는 처음부터 내가 시작한 것입니다. 옳은? –

답변

0

옵션 2가 작동하면 목록에있는 버튼을 추가하기 만하면됩니다. 배열 대신 목록 (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

방금 ​​코드를 사용하여 오류가 발생했습니다. 오류 : 'Controls'가 선언되지 않았습니다. 중요하지만 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들 컨테이너 컨트롤 안에 중첩되는 경우, (예를 들어, 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 

업데이트 그냥 재미를 위해, 여기에 다른 유형을 찾을 수있는 일반 버전입니다 제어.

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)