VB.Net:动态创建的月历不会触发 Lost Focus 或 GotFocus

Posted

技术标签:

【中文标题】VB.Net:动态创建的月历不会触发 Lost Focus 或 GotFocus【英文标题】:VB.Net: Dynamicly created MonthCalendar does not fire LostFocus or GotFocus 【发布时间】:2012-08-23 18:30:45 【问题描述】:

我创建了一个表单,该表单具有一个选项卡式控件,可将用户控件动态添加到每个选项卡,并在表单底部添加一个 StatusStrip。当应用程序启动时,用户控件会根据安全性加载到选项卡中,并至少加载 1 个选项卡。在 StatusStrip 上,有两个 ToolStripComboBoxes、2 个 ToolStripButtons、1 个 ToolStripLabel 和 1 个 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 在表单类的顶部被定义为 Protected。因此,按下按钮将创建 MonthCalendar 并正确定位它,如果它不存在,如果它存在,则将其删除。这没有问题。

我的问题是 theCal 永远不会触发 GotFocus 或 LostFocus。我有如下定义的过程 theCalLostFocus 并且它从不抛出异常。我可以在 throw 处设置一个断点,而代码永远不会到达那个点。

Private Sub theCalLostFocus(ByVal sender As Object, ByVal e As EventArgs)
    Throw New NotImplementedException
End Sub

单击 Cal 上的日期将调用 CalDateSelected 过程,但单击表单的任何其他区域不会触发 CalLostFocus。由于用户可能不想选择日期并且我不想强迫他们必须按下按钮来移除 theCal,我希望能够在失去焦点时移除 theCal。任何人都知道为什么会发生这种情况并且有人有解决方案吗?

谢谢。 -NCGrimbo

【问题讨论】:

【参考方案1】:

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

Rq :在编写时,您的代码存在内存泄漏,因为您在清除 theCal 时没有删除事件处理程序,因此由于保留了对 theCal 的引用,因此 theCal 和事件处理程序都不会被清除,这会导致内存泄漏(循环引用)。

【讨论】:

我将 AddHandler 语句移动到 theCal.Show() 之后的行,但没有发现行为发生任何变化。 (我根据您的注释添加了对事件处理程序的删除。) 我刚刚注意到您的 (Got/Lost)focus 事件处理程序的签名不正确。它应该是一个路由事件:(ByVal sender As Object, ByVal e As RoutedEventArgs) 当我更改对 RoutedEventArgs 的调用时,出现错误:未定义类型“RoutedEventArgs”。 奇怪...您的参考文献中没有 Presentation 核心? 1) 编写 System.Windows.RoutedEventArgs 2) 如果它仍然不起作用,请将 PresentationCore 添加到您的引用(项目/引用)

以上是关于VB.Net:动态创建的月历不会触发 Lost Focus 或 GotFocus的主要内容,如果未能解决你的问题,请参考以下文章

VB.NET 在月历中禁用过去的日期

使用 VB.NET 应用程序手动创建 MySQL 触发器(语法错误)

在 vb.net 中为 .net 1.1 框架动态创建 pdf 文件 [关闭]

在 vb.net 中显示 mothcalander 控制的月份?

VB.NET ReportViewer 动态绑RDLC

vb.net引用Dll的问题