【发布时间】:2020-02-18 18:31:07
【问题描述】:
我的表单上有一个 TextBox 控件。我使用控件上的 Leave 事件来处理用户输入。如果用户单击表单上的其他控件,它可以正常工作,但是当用户直接进入主菜单时,甚至不会被触发。任何想法我应该使用哪个事件来让它每次都被触发?
【问题讨论】:
我的表单上有一个 TextBox 控件。我使用控件上的 Leave 事件来处理用户输入。如果用户单击表单上的其他控件,它可以正常工作,但是当用户直接进入主菜单时,甚至不会被触发。任何想法我应该使用哪个事件来让它每次都被触发?
【问题讨论】:
我找到了一个合理的解决方法,我手动将焦点设置在主菜单上:
编辑:按照@TcKs 的建议,我将事件从ItemClicked 更改为MenuActivate。非常感谢您的帮助!
private void menuStrip1_MenuActivate( object sender, EventArgs e )
{
menuStrip1.Focus();
}
【讨论】:
您应该使用“Validating”和“Validated”事件来检查用户的输入。 然后,如果用户转到另一个控件“A”,并且控件“A”的属性“CausesValidation”设置为“true”(其默认值),则会触发“Validating”和“Validated”事件。
菜单也有“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 而不是“this”。例如在 MDI 子窗口中。
【讨论】:
在某些情况下没有触发 Lostfocus,例如单击工具栏按钮和菜单项。 我过去常常使用本地“LastControl”变量来解决这个问题,并在菜单获得焦点时自己处理它。
菜单单击不会失去文本框焦点是有原因的。例如,如果您想要一个带有“粘贴”的“编辑”菜单,则“粘贴”应该针对具有焦点的控件进行操作,因此它不能从表单上的任何控件中窃取焦点。
所以菜单可以看作是一个上下文菜单,不会从控件中窃取焦点。
【讨论】:
在玩菜单时,您必须以某种方式模拟失去焦点,并且可能要记住它的位置,以防您关闭菜单而不做任何事情,这样焦点就会返回到文本框
【讨论】:
你需要一个每 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
【讨论】: