VB.Net:动态创建的MonthCalendar不会触发LostFocus或GotFocus

时间:2012-08-23 18:30:45

标签: vb.net monthcalendar lostfocus

我创建了一个带有选项卡式控件的表单,该控件可以动态地为每个选项卡添加用户控件,并在表单底部添加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

1 个答案:

答案 0 :(得分:1)

我并不感到惊讶,焦点事件不会触发,因为您在插入可视树之前添加处理程序。尝试在调用show()之后添加处理程序。或者可能在加载的事件处理程序中。请注意,由于您请求焦点,因此每次都会调用焦点事件处理程序。

Rq:在编写时,你的代码有内存泄漏,因为在清除theCal时没有删除事件处理程序,所以由于引用保留在theCal中,所以theCal和事件处理程序都不会被清除,这会导致内存泄漏(周期性参考)。