2010-09-02 5 views
2

У меня есть методКак определить, был ли TextChanged запущен клавиатурой в C#?

private void textBoxPilot_TextChanged(object sender, TextChangedEventArgs e) 
{ ... } 

где текстовое поле в вопросе принимает строку поиска от пользователя и заполняющий ListBox с результатами на каждое нажатие клавиши.

Впоследствии, когда предмет выбран из ListBox, я бы хотел, чтобы выбор отражался в том же Textbox. Тем не менее, я не хочу запускать механизм поиска, который заставит Listbox забыть о своем выборе.

Как определить, было ли событие TextChanged инициировано пользователем (через клавиатуру или, возможно, копирование/вставку) или другим способом, используя textBoxPilot.Text = "Pilot name";?

Спасибо.

ответ

1

хака, но ....

public class MyForm : Form 
{ 
    private bool _ignoreTextChanged; 

    private void listView1_SelectionChanged(object sender, EventArgs e) 
    { 
     _ingnoreTextChanged = true; 
     textBoxPilot.Text = listView1.SelectedValue.ToString(); // or whatever 
    } 

    private void textBoxPilot_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     if(_ignoreTextChanged) 
     { 
      _ignoreTextChanged = false; 
      return; 
     } 

     // Do what you would normally do. 
    } 
} 
+0

я в конечном итоге, используя комбинацию вашего ответа и ответа Скотт: частной ничтожной listBoxPilot_SelectionChanged (объект отправителя, SelectionChangedEventArgs е) { textBoxPilot.IsEnabled = false; Участник selectedPilot = (Member) listBoxPilot.SelectedItem; textBoxPilot.Text = selectedPilot.firstName; textBoxPilot.IsEnabled = true; } частная пустота textBoxPilot_TextChanged (объект отправителя, TextChangedEventArgs е) { если (textBoxPilot.IsEnabled == ложь) возвращение; [поиск материалов] } Это устраняет необходимость в новой глобальной переменной. Спасибо вам обоим. – Anders

0

Если пользователь выбирает «Имя пилота» из списка, вы устанавливаете текстовое поле «Имя пилота». Это приведет к тому, что в поле списка выберите «Имя пилота». Поэтому выбор должен быть сохранен. Вам просто нужно сломать рекурсию.

+0

Правда, однако, это не будет не годен в этом случае. Пользователь будет время от времени использовать результаты с помощью клавиш со стрелками, а ListBox выбирает каждый элемент по ходу. – Anders

1

Инвалида управление не срабатывает событие. Таким образом, два варианта, либо всегда отключить обновить текст повторно включить или создать производный класс обертку (с помощью этого метода можно еще сделать привязку данных)

class myClass : TextBox 
{ 
    public virtual string TextWithoutEvents 
    { 
     get 
     { 

      return base.Text; 
     } 
     set 
     { 
      bool oldState = Enabled; 
      Enabled = false; 
      base.Text = value; 
      Enabled = oldState; 
     } 
    } 
} 
+0

Спасибо за вдохновение. В конце концов, я использовал комбинацию вашего ответа и ответа Джерода; см. мой ответ на его сообщение. – Anders