我有一个带有文本框的表单。我创建一个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设置还是因为用户输入了某些内容(或粘贴了它)。我如何获得这些信息?
我尝试在创建绑定时设置了一个标志,但在绑定时,文本框位于不可见的标签控件上。当我切换到有问题的文本框的标签时,事件实际上会触发。
答案 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;