我创建了一个带有选项卡式控件的表单,该控件可以动态地为每个选项卡添加用户控件,并在表单底部添加StatusStrip。当应用程序启动时,用户控件将根据安全性加载到选项卡中,并且至少加载了1个选项卡。在StatusStrip上,有两个ToolStripComboBox,两个ToolStripButtons,一个ToolStripLabel和一个ToolStripStatusLabel。一切都很好,很有效。
当用户按下两个按钮中的一个按钮时,我一直想要使用MonthCalendar弹出窗口。这是我用来执行此操作的代码:
If IsNothing(theCal) Then
theCal = New MonthCalendar
AddHandler theCal.DateSelected, AddressOf theCalDateSelected
AddHandler theCal.LostFocus, AddressOf theCalLostFocus
AddHandler theCal.GotFocus, AddressOf theCalLostFocus
theCal.Parent = Me
theCal.Top = StatusStripMain.Top - theCal.Height
theCal.Left = ComboBoxAvailableLegDay.Bounds.X
theCal.Anchor = AnchorStyles.Bottom + AnchorStyles.Left
theCal.Show()
theCal.BringToFront()
theCal.Focus()
Else
Me.Controls.Remove(theCal)
theCal = Nothing
End If
theCal在表单的顶部定义为受保护。因此,按下按钮将创建MonthCalendar,如果它不存在则正确定位,如果它存在,则将其删除。这没有问题。
我的问题是theCal从不会触发GotFocus或LostFocus。我已经将theCalLostFocus的过程定义如下,它永远不会引发异常。我可以在抛出时设置断点,代码永远不会达到这一点。
Private Sub theCalLostFocus(ByVal sender As Object, ByVal e As EventArgs)
Throw New NotImplementedException
End Sub
单击theCal上的日期将调用theCalDateSelected过程,但单击窗体的任何其他区域不会触发CalLostFocus。由于用户可能不想选择日期而我不想强迫他们按下按钮来移除ca,我希望能够在失去焦点时移除theCal。任何人都知道为什么会这样,任何人都有解决方案?
感谢。 -NCGrimbo
答案 0 :(得分:1)
我并不感到惊讶,焦点事件不会触发,因为您在插入可视树之前添加处理程序。尝试在调用show()之后添加处理程序。或者可能在加载的事件处理程序中。请注意,由于您请求焦点,因此每次都会调用焦点事件处理程序。
Rq:在编写时,你的代码有内存泄漏,因为在清除theCal时没有删除事件处理程序,所以由于引用保留在theCal中,所以theCal和事件处理程序都不会被清除,这会导致内存泄漏(周期性参考)。