Остановить событие TextChanged от запуска события Leave - PullRequest
2 голосов
/ 22 сентября 2011

Я работаю над простым приложением WinForms для государственной школы, где пользователи могут идентифицировать себя, введя либо свои сетевые идентификаторы (которые являются не защищенной информацией), либо их системные идентификаторы (которые являются защищенная информация). Я хочу переключиться на символ пароля, когда программа обнаруживает системный идентификатор (который работает просто отлично); однако, когда я делаю это, мое приложение также запускает событие Leave текстового поля, которое говорит пользователям, что нужно исправить проблему с данными для входа в систему ... еще до того, как возникнет проблема.

Вот мой код:

void login_TextChanged(object sender, EventArgs e)
{
    login.UseSystemPasswordChar = login.Text.StartsWith(<prefix-goes-here>);
}

private void login_Leave(object sender, EventArgs e)
{
    if (login.Text.StartsWith(<prefix-goes-here>) && login.Text.Length != 9)
    {
        signInError.SetError(login, "Your System ID must be nine digits.");
        login.BackColor = Color.LightPink;
    }
    else if (login.Text.IsNullOrWhiteSpace())
    {
        signInError.SetError(login, "Please enter your username or System ID.");
        login.BackColor = Color.LightPink;
    }
    else
    {
        signInError.SetError(login, string.Empty);
        login.BackColor = Color.White;
    }
}

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

Ответы [ 3 ]

2 голосов
/ 22 сентября 2011

Помещение TextBox в GroupBox воспроизводит это поведение - что странно.

Если вы хотите сохранить свой GroupBox, вот обходной путь:

private void login_TextChanged(object sender, EventArgs e)
{
  login.Leave -= login_Leave;
  login.UseSystemPasswordChar = login.Text.StartsWith(<prefix-goes-here>);
  login.Leave += login_Leave;
}
1 голос
/ 22 сентября 2011

По какой-либо причине событие Leave срабатывает, когда логин TextBox находится внутри элемента управления GroupBox.Замена GroupBox простым элементом управления Label предотвратила запуск кода в событии TextChanged для события Leave.

0 голосов
/ 22 сентября 2011

Да, это особенность свойства UseSystemPasswordChar.Это свойство, которое должно быть указано при создании собственного элемента редактирования (ES_PASSWORD).Изменение этого требует Winforms, чтобы разрушить тот нативный контроль и воссоздать его.Это имеет побочные эффекты, одним из которых является то, что фокус не может оставаться на текстовом поле, так как окно исчезает.Windows запускает уведомление WM_KILLFOCUS.

Находясь внутри GroupBox, действительно является необходимым компонентом, Winforms не подавляет событие Leave, когда получает уведомление.Ошибка.

Множество возможных исправлений.Вы можете установить флаг, который обработчик события Leave может проверить, чтобы узнать, что это было вызвано изменением свойства.

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