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