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