为什么我的事件处理程序会触发两次?

时间:2015-06-08 19:19:59

标签: vb.net events addhandler

我有一堆面板,我将添加到单个父面板中,我想向所有面板添加事件监听器,但直到它们都被添加到父级之后才会添加(因为我不会这样做)希望每次添加新面板时触发事件侦听器。所以我使用以下代码:

   Dim temp_object As question_bar = Nothing
   For Each q As Object In review_holder.Controls
       If TypeOf q Is question_bar Then
          temp_object = q
          AddHandler temp_object.Resize, AddressOf temp_object.resize_me
       End If
   Next

   For Each q As Object In review_holder.Controls
      If TypeOf q Is question_bar Then
         temp_object = q
         temp_object.resize_me()
      End If
   Next

但我注意到resize_me()子程序每次控制都会被触发两次。我只希望它开一次。所以我使用此代码

进行了追踪
MsgBox((New System.Diagnostics.StackTrace).GetFrame(1).GetMethod.Name)

我看到每次调用它时调用方法都是这个子程序和_Lambda $ _365。那是什么呀?我如何找出它的来源?

BTW,这是一个使用VS2012的winforms应用程序。

EDIT ---------------------------------------------- --------------------------

Public Sub resize_me()

 MsgBox((New System.Diagnostics.StackTrace).GetFrame(1).GetMethod.Name)

 If Me.minimized = True Then
    Me.Height = 0
    Exit Sub
 End If

 number_panel.Width = my_parent.number_width
 number_text.Width = my_parent.number_width
 number_separator.Left = number_panel.Right
 question_panel.Left = number_separator.Right
 question_panel.Width = question_panel.Parent.Width * initial_question_width + (question_padding * 2)


End Sub

1 个答案:

答案 0 :(得分:0)

当你进入resize事件时,改变大小的属性可以解释为什么你的代码第二次被再次调用。通常我会尽量避免这种情况,但这并不总是可行的。在这些情况下,作为阻止重新进入的标志的全局变量可以节省一天

Dim insideResize As Boolean

Public Sub resize_me()

 if insideResize = True Then
     Exit Sub
 End if

 insideResize = True
 Try
    If Me.minimized = True Then
       Me.Height = 0
       Exit Sub
    End If

    number_panel.Width = my_parent.number_width
    number_text.Width = my_parent.number_width
    number_separator.Left = number_panel.Right
    question_panel.Left = number_separator.Right
    question_panel.Width = question_panel.Parent.Width * initial_question_width + (question_padding * 2)
  Finally
    insideResize = False
  End Try

End Sub

为了使用这种模式保持安全,请记住始终使用Try / Finally块以确保当您退出Resize事件时,全局标志会正确地设置回false。