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

вы можете написать подпрограмму или функцию, что код и передать имя формы в качестве параметра. затем просто вызовите его из разных мест (разрешите аспекты NON GENERIC в событиях щелчка, затем вызовите общий код). вам может потребоваться передать тип (форму), который вы хотите создать, если он не будет всегда одинаковым. – Plutonix

ответ

1

Почему бы просто не использовать лямбду, которая проходит по типу формы? Вы можете использовать GetType найти текстовое имя и использовать простое ограничение, чтобы создавать экземпляры

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

Обработчик нажмите будет выглядеть по существу следующий

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

Спасибо! Но я не знаю, что означает эта ошибка: параметр Lambda 'e' скрывает переменную в закрывающем блоке, ранее определенную переменную диапазона или неявно объявленную переменную в выражении запроса. ' – Ferret9

+0

@IanO просто меняет' e' на другое имя, которое не конфликтует – JaredPar

Смежные вопросы