WinForms:进入主菜单后,文本框离开事件不会被触发

时间:2008-12-01 14:26:01

标签: c# .net winforms

我的表单上有一个TextBox控件。我在控件上使用Leave事件来处理用户输入。如果用户单击表单上的其他控件,它可以正常工作,但是当用户直接进入主菜单时,偶数不会被触发。我应该用什么想法让它每次都被解雇?

5 个答案:

答案 0 :(得分:6)

我找到了一个合理的解决方法,我手动将焦点放在主菜单上:

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

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

答案 1 :(得分:2)

您应该使用“验证”和“验证”事件来检查用户的输入。 然后,如果用户转到另一个控件“A”,并且控件“A”将属性“CausesValidating”设置为“true”(其默认值),则将触发“Validating”和“Validated”事件。

菜单也有“CuasesValidating”属性。

修改 对不起,我忘了菜单条中的“CuasesValidating”是我们的功能而不是内置的。 但验证检查非常简单:

private void menuStrip1_MenuActivate( object sender, EventArgs e ) {
    bool ret = this.Validate( false );
    if ( false == ret ) {
        // user's input is wrong
    }
}

用户任何ContainerControl而不是“this”,如果要在另一个控件中检查验证而不是“this”表单。例如,在MDI子窗口中。

答案 2 :(得分:1)

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

有理由说菜单点击不会丢失文本框焦点。如果你想要一个带有“粘贴”的“编辑”菜单,“粘贴”应该对有焦点的控件起作用,因此它不能从表单上的任何控件中窃取焦点。

因此菜单可以看作是一个不会从控件中窃取焦点的上下文菜单。

答案 3 :(得分:0)

在玩菜单时,你必须以某种方式模拟丢失的焦点,并且可能记住它在哪里关闭菜单而不做任何事情,这样焦点就会回到文本框中

答案 4 :(得分:-1)

您需要每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