WinForms: событие Textbox Leave не запускается после перехода в главное меню - PullRequest
7 голосов
/ 01 декабря 2008

У меня есть элемент управления TextBox в моей форме. Я использую событие Leave на элементе управления для обработки ввода пользователя. Он отлично работает, если пользователь нажимает на какой-то другой элемент управления в форме, но даже не срабатывает, когда пользователь переходит прямо в главное меню. Любые идеи, какое событие я должен использовать, чтобы его каждый раз запускали?

Ответы [ 5 ]

6 голосов
/ 01 декабря 2008

Я нашел разумный обходной путь, вручную установил фокус на главном меню:

РЕДАКТИРОВАТЬ: Как предложено @TcKs, я изменил событие с ItemClicked на MenuActivate. Большое спасибо за помощь!

    private void menuStrip1_MenuActivate( object sender, EventArgs e )
    {
        menuStrip1.Focus();
    }
2 голосов
/ 01 декабря 2008

Вы должны использовать события «Проверка» и «Проверка» для проверки ввода пользователя. Затем, если пользователь перейдет к другому элементу управления «A», а элемент управления «A» имеет свойство «CausesValidating», установленное в значение «true» (его значение по умолчанию), произойдет событие «Проверка» и «Проверка».

Меню также имеет свойство "CuasesValidating".

Edit: Извините, я забыл, что "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.

1 голос
/ 01 декабря 2008

В некоторых случаях Lostfocus не срабатывает, например, нажимая кнопки панели инструментов и пункты меню. Я использую это для обхода локальной переменной «LastControl» и обрабатываю ее самостоятельно, когда меню получает фокус.

Есть причины, по которым щелчок меню не теряет фокус текстового поля. Если вы хотите иметь, например, меню «Редактировать» с «Вставить», «Вставить» должно действовать против элемента управления, который имеет фокус, и поэтому он не должен захватывать фокус из каких-либо элементов управления в форме.

Таким образом, меню можно рассматривать как контекстное меню, которое не крадет фокус у элемента управления.

0 голосов
/ 01 декабря 2008

вам нужна метка 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
0 голосов
/ 01 декабря 2008

при игре с меню вы должны каким-то образом смоделировать потерянный фокус и, возможно, вспомнить, где он был, если вы закрываете меню, ничего не делая, чтобы фокус вернулся в текстовое поле

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...