2013-03-21 2 views
2

큰 VB6 프로젝트를 VB.NET 프로젝트로 포팅했습니다. 올바르게 컴파일되지만, 대부분의 이벤트 핸들러를 주석 처리해야했습니다. 주위에는 winform 객체에 대한 배열 컬렉션이 없으므로 컬렉션 배열에있는 다양한 객체를 List 객체에 배치합니다.VB.NET의 List (Of T) 이벤트 발생시키기

예를 들어 VB6에서는 버튼 배열을 사용할 수 있습니다.

분명히 내 코드에서 내가

Dim WithEvents cmdButtons As New List(Of Button) 

있어 (및로드 이벤트에서, 목록이 전파), 당신은 컨테이너에 이벤트를 발생 수 없습니다. 컨테이너의 내용 (다른 이름을 갖음)에서 이벤트를 발생시키는 방법이 있습니까?

버튼 생성 코드에는 이벤트 이름이 있지만 처리기가 코드의 핸들 부분이 없으므로 처리기가 인터셉트하지 않는다는 점을 이해했습니다 (주석 처리됨).

+0

** 관련 ** 코드 부분을 몇 가지 더 제공하십시오. –

+0

예. 이전 VB 코드에서는 Public WithEvents txtFields As TextBoxArray를 좋아할 것입니다. 이것은 VB.NET에서 지원되지 않습니다. VS2008을 사용하면 txtField_0에서 txtField_n까지의 TextBoxes로드가 생성됩니다. 이건 괜찮아. 그러나 원래 코드는 이전 배열을 반복하고 이전 배열은 이벤트를 시작하는 데 사용됩니다. VB.NET에서는 배열이 없으므로 List (Of TextBox)를 배열 컨테이너로 사용하고 있습니다. 괜찮아요.하지만 이벤트는 무시됩니다. 내가 가지고있는 코드를 사용하여 이벤트를 발생시키는 방법이 있는지 찾으려고 노력 중입니다. – Nodoid

+0

무언가를 명확히하기 위해 : 당신은 모든 것을 잘못된 방향으로 바라보고 있습니다. 컨트롤 배열은 컨트롤의 * normal * 배열을 만들 수 없기 때문에 * 해결 방법 *이었습니다. .NET에서이 제한은 더 이상 존재하지 않으므로 컨트롤 배열이 중복되어 제거되었습니다. 그리고 대답에 따르면 컬렉션을 이벤트 핸들러에 연결하는 것도 가능하다는 것을 알 수 있습니다. VB6에서 허용하지 않은 또 다른 사항 (직접 적용 할 수있는 영리한 해킹이 있습니다). –

답변

3

잘 모르겠지만 컨테이너의 일부 버튼에 이벤트 처리기를 추가하고 목록에서 해당 버튼을 참조 할 수있게하려면

과 같은 작업을 수행 할 수 있습니다.
Public Class Form1 

    Dim myButtons As List(Of Button) 

    Private Sub AddButtonsToList(targetContainer As Control) 
     myButtons = New List(Of Button) 

     For Each c In targetContainer.Controls 
      If TypeOf c Is Button Then 
       Dim bn = DirectCast(c, Button) 
       AddHandler bn.Click, AddressOf SomeButton_Click 
       myButtons.Add(bn) 
      End If 
     Next 
    End Sub 

    Private Sub SomeButton_Click(sender As Object, e As EventArgs) 
     Dim bn = DirectCast(sender, Button) 
     MsgBox("You clicked " & bn.Name) 
    End Sub 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     ' GroupBox1 has some Buttons in it 
     AddButtonsToList(GroupBox1) 
    End Sub 

End Class 
+0

그게 내가 뭘하고 있는지 정확하게 보인다. 현재 myButtons.AddRange (새 단추() {_btn_0, _btn_1, _btn_2})가로드되어 있습니다. addrange 후에 핸들러를 추가하는 foreach를 추가 할 것이다. 감사합니다 :) – Nodoid

관련 문제