WinForms: двусторонняя проблема TextBox - PullRequest
2 голосов
/ 13 апреля 2009

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

Пользователь может редактировать это текстовое поле, тем самым изменяя соответствующий текст элемента списка.

Моя проблема заключается в следующем: я использую событие TextChanged, чтобы определить, когда пользователь вводит некоторый текст, и я обновляю внутренние переменные в обработчике событий, однако этот обработчик событий вызывается, когда я программно изменяю значения текстового поля. Я хочу, чтобы этот обработчик вызывался только когда пользователь изменяет текстовое поле. Как мне этого добиться?

edit: У меня та же проблема, что и со списком.

Ответы [ 6 ]

5 голосов
/ 14 апреля 2009

Вы можете использовать шаблон Latch : см. Rein в безудержных событиях с «Latch»

3 голосов
/ 13 апреля 2009

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

_updating = true;
_textBox.Text = "New Text";  

...      

_textBox_TextChanged( object sender, EventArgs e )
{
    if( _updating ) { _updating = false; return; }
    // Do something special with the new text.
}

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

class MyTextBox : TextBox
{
    public overrides string Text{ 
        get{ return base.Text; }
        set{
            if( value == Text ) return;
            _updating = true;
            base.Text = value;
            _updating = false;
           }
    }
}
1 голос
/ 13 апреля 2009

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

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

1 голос
/ 13 апреля 2009

Событие TextChanged вызывается всякий раз, когда TextBox изменяет свое свойство Text, что может быть достигнуто путем изменения свойства Text, или когда пользователь непосредственно изменяет текст, существуют другие события, которые более вероятно используются для сценария, который вы пытаетесь достичь.

  • KeyPress: поднимается всякий раз, когда пользователь нажимает клавишу
  • KeyDown: поднимается всякий раз, когда ключ опущен
  • KeyUp: Поднимается всякий раз, когда ключ поднимается (отпускается)

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

0 голосов
/ 13 апреля 2009

Проверьте фокусировку на текстовом поле. Если у него нет фокуса, это означает, что пользователь не редактирует его.

0 голосов
/ 13 апреля 2009

Вы хотите сказать, что вы хотите, чтобы во втором текстовом поле отображалось что-то, что зависит от того, что находится в первом текстовом поле, но ТОЛЬКО если пользователь установил это?

Не могли бы вы рассказать о том, чего вы пытаетесь достичь? Мне кажется, что ваш дизайн пользовательского интерфейса может сбивать с толку пользователя, поскольку текст в B иногда связан с A, а иногда нет.

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

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