Как узнать, когда привязка устанавливает текстовое поле против пользователя? - PullRequest
1 голос
/ 04 ноября 2010

У меня есть форма с текстовым полем на нем. Я создаю объект BindingSource, подключаю к нему мой DomainObject, затем связываю BindingSource с TextBox. Код выглядит примерно так:

private BindingSource bndSource = new BindingSource();

private void Form1_Load(object sender, EventArgs e) {
    bndProposal.DataSource = new DomainObject() { ClientCode = "123", EdiCode = "456" }; 
    txtAgencyClientCode.DataBindings.Add("Text", bndProposal, "ClientCode", 
                                false, DataSourceUpdateMode.OnPropertyChanged, null);

}

private void txtAgencyClientCode_TextChanged(object sender, EventArgs e)
{
    Debug.WriteLine("txtAgencyClientCode_TextChanged");
}

public class DomainObject
{
    public string ClientCode { get; set; }
    public string EdiCode { get; set; }
}

Код работает нормально. Однако я хотел бы знать причину, по которой происходит событие TextChanged: это происходит потому, что оно устанавливается BindingSource, или потому, что пользователь что-то ввел (или вставил). Как мне получить эту информацию?

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

Ответы [ 2 ]

1 голос
/ 05 ноября 2010

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

private void Form1_Load(object sender, EventArgs e) {
    txtAgencyClientCode.DataBindings.Add("Text", bndProposal, "ClientCode", 
                                false, DataSourceUpdateMode.OnPropertyChanged, null);
    txtAgencyClientCode.TextChanged += new System.EventHandler(txtAgencyClientCode_TextChanged);

}

Вы можете отменить подписку перед каждой программной модификацией текста, если хотите быть уверенным:

txtAgencyClientCode.TextChanged  -= txtAgencyClientCode_TextChanged;
1 голос
/ 04 ноября 2010

Есть ли причина, по которой вы должны использовать событие TextChanged для входа пользователя? Не могли бы вы вместо этого использовать другое событие, например KeyPress? Все зависит от того, что вам нужно делать, когда текст меняется. Другим вариантом будет сравнение значения TextChanged с DataBoundItem.

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