我如何知道绑定何时设置文本框与用户?

时间:2010-11-04 18:30:34

标签: c# winforms data-binding

我有一个带有文本框的表单。我创建一个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 个答案:

答案 0 :(得分:1)

您是否有必要使用TextChanged事件进行用户输入?您是否可以考虑使用其他活动,例如KeyPress?这完全取决于文本更改时您需要做什么。另一种选择是将TextChanged上的值与DataBoundItem进行比较。

答案 1 :(得分:1)

您可以在设置文本后订阅该事件。在设计器中禁用它并将其添加到表单load:

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;