2014-02-11 3 views
0

프로젝트에 몇 개의 메뉴 항목이 있습니다. 클릭하면 새 양식이 열리 며, 클릭 할 때마다 아래 코드가 실행됩니다. 그러나 나는 각 MenuItem_Click 이벤트에 대해이를 추가해야하므로 코드를 변경할 때마다 양식간에 복사하고 지나쳐야합니다. FormName이 유일한 변경 사항입니다. 모든 메뉴 항목의 이름은 해당 양식 인 mi_FormName의 이름을 따서 지정됩니다. 그리고 일반적인 이벤트 처리기를 만드는 방법을 알고 있습니다.Visual Studio - 일반용 처리기

클릭 한 메뉴 항목의 이름을 잡아서 mi_을 제거하고 FormName과 같은 위치에 삽입 할 수있는 방법이 있습니까?

Private Sub MenuItem_Click(sender As Object, e As EventArgs) Handles MenuItem.Click 

    Dim F As Form 
    If Not IsNothing(modForms.CheckOpen("FormName")) Then 
     F = modForms.CheckOpen("FormName") 
     If F.IsDisposed Then 
      modForms.CheckOpen.Remove("FormName") 
      F = New FormName 
      F.Show() 
     ElseIf F.Visible = False Then 
      F.Show() 
     Else 
      F.BringToFront() 
     End If 
    Else 
     F = New FormName 
     F.Show() 
    End If 

End Sub 
+0

당신이에 대한 하위 또는 기능을 쓸 수를 다음과 같이

AddHandler mi_FormName.Click, Sub(s, e) OnClick(Of FormName) AddHandler mi_OtherForm.Click, Sub(s, e) OnClick(Of OtherForm) 

클릭 처리기는 본질적으로 보일 것 생성 할 수 있도록 간단한 제약 조건을 사용할 수 있습니다 코드를 작성하고 양식 이름을 매개 변수로 전달하십시오. 그런 다음 다양한 장소에서 호출합니다 (클릭 이벤트의 비 일반 측면을 해결 한 다음 공통 코드를 호출). 항상 같지 않으면 작성하려는 유형 (양식)을 전달할 수 있습니다. – Plutonix

답변

1

왜 양식의 유형을 따라 전달하는 람다를 사용하지 않는 것이 좋을까요? 당신은 텍스트 이름을 찾기 위해 GetType를 사용하여 인스턴스가

Private Sub OnClick(Of T As {New, Form})() 
    Dim name = GetType(T).Name 
    Dim F As Form 
    If Not IsNothing(modForms.CheckOpen(name)) Then 
     F = modForms.CheckOpen(name) 
     If F.IsDisposed Then 
      modForms.CheckOpen.Remove(name) 
      F = New T 
      F.Show() 
     ElseIf F.Visible = False Then 
      F.Show() 
     Else 
      F.BringToFront() 
     End If 
    Else 
     F = New T 
     F.Show() 
    End If 
End Sub 
+0

감사합니다! 그러나이 에러가 의미하는 바를 알지 못합니다. 람다 파라미터 'e'는 둘러싼 블록, 이전에 정의 된 범위 변수 또는 질의 표현식에서 암시 적으로 선언 된 변수에서 변수를 숨 깁니다. ' – Ferret9

+0

@IanO는'e' 만 변경합니다. 충돌하지 않는 다른 이름 – JaredPar

관련 문제