WinForms:转到主菜单后,Textbox Leave事件不会触发

7

我在表单上有一个文本框控件。我使用该控件的离开事件来处理用户输入。如果用户单击表单上的其他控件,它可以正常工作,但是当用户直接进入主菜单时,该事件不会触发。有什么办法可以使其每次都触发?

5个回答

6
我找到了一个合理的解决方法,我手动设置了主菜单的焦点:

编辑:根据@TcKs的建议,我将事件从ItemClicked更改为MenuActivate。非常感谢您的帮助!

    private void menuStrip1_MenuActivate( object sender, EventArgs e )
    {
        menuStrip1.Focus();
    }

它只适用于鼠标,但不适用于键盘。请查看我的编辑。 - TcKs

2
您应该使用“验证”和“已验证”事件来检查用户的输入。然后,如果用户转到另一个控件“A”,并且控件“A”的属性“CausesValidation”设置为“true”(默认值),则将触发“验证”和“已验证”事件。
菜单也有“CausesValidation”属性。 编辑: 抱歉,我忘记了菜单栏中的“CausesValidation”是我们的功能,而不是内置功能。但验证检查非常简单:
private void menuStrip1_MenuActivate( object sender, EventArgs e ) {
    bool ret = this.Validate( false );
    if ( false == ret ) {
        // user's input is wrong
    }
}

如果您想在与“this”表单不同的控件中检查验证,可以使用任何ContainerControl。例如,在MDI子窗口中。


我找不到Toolstripmenuitem或menustrip上的CausesValidating属性... - Stefan
我无法在Toolstripmenuitem上找到CausesValidating属性。 - Grzenio

1

有时会出现Lostfocus未触发的情况,例如单击工具栏按钮和菜单项。 我通常使用本地的“LastControl”变量来解决这个问题,并在菜单获得焦点时自己处理它。

菜单点击不失去文本框焦点的原因是有理由的。 如果您想拥有一个包含“粘贴”选项的“编辑”菜单,则“粘贴”应该针对具有焦点的控件进行操作,并且因此不能从表单上的任何控件窃取焦点。

因此,菜单可以被视为不从控件窃取焦点的上下文菜单。


菜单不应该从控件中夺取焦点,这是公平的。但另一方面,没有合理简单的机制来处理我的情况。你的方法在简单情况下还可以,但我有一系列用户控件在不同的表单上使用,所以我不能真正拥有LastControl。 - Grzenio
是的,我准备发布一个示例,当菜单被激活时动态转发InvokeLostFocus(LastControl)。但是后来我看到了你使用menustrip1.focus()的解决方法,所以我就没发了。 ;) - Stefan

0

当处理菜单时,你需要模拟一种失去焦点的情况,并且可能要记住它的位置,以防你在不做任何操作的情况下关闭菜单,这样焦点就会返回到文本框中。


-1

你需要一个1像素的标签

Private Sub TextBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Leave
    MsgBox("yes")
End Sub

Private Sub MenuStrip1_MenuActivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuStrip1.MenuActivate
    CType(sender, MenuStrip).Tag = ActiveControl
    Label1.Focus()
End Sub

Private Sub MenuStrip1_MenuDeactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuStrip1.MenuDeactivate
    If CType(sender, MenuStrip).Tag Is Control AndAlso CType(CType(sender, MenuStrip).Tag, Control).CanFocus Then
        CType(CType(sender, MenuStrip).Tag, Control).Focus()
    End If
    CType(sender, MenuStrip).Tag = Nothing
End Sub

我知道这是VB.Net代码,但在C#下应该是相同的逻辑。 - Fredou
似乎不起作用 - ActiveControl 是我点击的菜单项 :( - Grzenio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接