Davidw1969 Ответов: 4

Не удается вызвать событие проверки текстового поля


У меня есть форма WinForms с текстовым полем, ComboBox и несколькими другими элементами управления. Пользователь может ввести строку поиска в текстовое поле, а затем поле со списком будет отфильтровано на основе строки поиска. Метод фильтрации срабатывает при изменении текста события текстового поля.

Когда пользователь вводит текст в текстовое поле, свойству DroppedDown поля со списком присваивается значение true, чтобы поле со списком открывалось и пользователь мог видеть элементы по мере их фильтрации.

Все это прекрасно работает.


Пользователь может ввести строку фильтра, в результате чего поле со списком будет пустым. Вот тут-то и возникает проблема. В поле со списком должен быть как минимум 1 действительный элемент. Итак, я хотел бы сделать вот что:

Если текстовое поле теряет фокус, я хочу использовать событие проверки, чтобы проверить, есть ли хотя бы один элемент в поле со списком. Если нет, предупредите пользователя и отмените, чтобы фокус оставался в текстовом поле.

Проблема в том, что происходит что-то странное, если я нажимаю на форму, содержащую текстовое поле, и в этом поле со списком нет никаких элементов. Я получаю очень не описательное сообщение об ошибке в родительской форме, которая запустила форму, над которой я работаю.

QueryDesignerTool qdTool = new QueryDesignerTool();
            // moved this to QueryDesignerTool_OnLoad function. ens 01/28/2015
            //this.Hide();
            DialogResult dr = qdTool.ShowDialog(this);


Я получаю
An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in System.Windows.Forms.dll

Additional information: InvalidArgument=Value of '0' is not valid for 'index'.


Во время выполнения кода, если я проверю qdTool и посмотрю на поле со списком, о котором идет речь, я увижу, что SelectedIndex поля со списком равен 0, а количество элементов равно 0, что является незаконным.

Я не уверен, почему он ошибается и возвращается к родительской форме. Но я прошу о помощи не поэтому.

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

Итак, правильно ли будет тогда перехватить событие щелчка для формы и обработать проверку этого текстового поля?

Что я уже пробовал:

Я описал то, что я пробовал в описании проблемы.

Ralf Meier

Текстовое поле теряет фокус только в том случае, если его получает другой элемент управления ...
Вы пробовали использовать MouseLeave-событие ?

4 Ответов

Рейтинг:
20

Davidw1969

Я решил проблему. Вместо того чтобы пытаться проверить, что пользователь вводит после того, как он щелкает вне текстового поля фильтра, я решил обработать его по-другому.

private void txtTbl1FromListFilter_TextChanged(object sender, EventArgs e)
   {
      string FilterText = txtTbl1FromListFilter.Text.ToLower().Trim();
      fromComboBox_T1.DroppedDown = true;
      FilterTables(FilterText, fromComboBox_T1, m_FromFilter_T1);

      if (fromComboBox_T1.Items.Count == 0)
      {
          txtTbl1FromListFilter.Text = PreviousFilterText_T1;
      }
      else
      {
          PreviousFilterText_T1 = txtTbl1FromListFilter.Text;
      }
  }


Я создал строковую переменную уровня модуля с именем PreviousFilterText_T1. Это значение устанавливается в пустую строку при загрузке формы. Поэтому, когда пользователь вводит что-то в текстовое поле фильтра, если результатом фильтрации является количество нулевых элементов в поле со списком, то все, что пользователь только что ввел в текстовое поле фильтрации, заменяется предыдущим значением этого текстового поля. Это также приводит к повторному срабатыванию события TextChanged, которое помещает элементы обратно в поле со списком на основе предыдущего текста фильтра. В противном случае, если в поле со списком есть элементы, PreviousFilterText_T1 получает значение текстового поля фильтра.

Это быстро и очень хорошо работает для меня.


Рейтинг:
1

Davidw1969

Спасибо. Я не хочу автозаполнения, потому что хочу, чтобы фильтр работал, даже если пользователь вводит что-то из середины строки. Фильтрация работает отлично. Мне просто нужно иметь возможность проверять, когда пользователь нажимает за пределами текстового поля.


Рейтинг:
0

JayantaChatterjee

Привет,
Я думаю, что ваше требование-это Combobox с автозаполнением:
Пожалуйста, проверьте эту ссылку:
Автозаполнение ComboBox c# vb.net[^]

Надеюсь, это поможет..


Рейтинг:
0

Midi_Mick

Чтобы устранить ошибку формы, перед фильтрацией ComboBox установите свойству SelectedIndex значение -1. Выполните SuspendLayout, установите свойство SelectedIndex равным -1, Filetre элементы, а затем сбросьте SelectedIndex соответствующим образом. Наконец, вызовите ResumeLayout, чтобы перерисовать комбо.

Я бы выполнил проверку в текстовом поле.Событие Leave, которое срабатывает всякий раз, когда текстовое поле теряет фокус.