我在刷新使用BindingSource对象的Windows窗体控件时遇到困难.我们有一个CAB / MVP / SCSF客户端,我(实际上是团队合作)正在开发中,它将与远程服务器上运行的WCF服务进行交互. (这是我们的首次尝试,因此我们处于学习模式).对服务的调用之一(从Presenter)返回一个DataSet,该数据集包含3个DataTable,分别称为“ Contract”,“ Loan”和“ Terms”.每个表仅包含一行.当服务返回数据集时,我们通过在视图中调用一个名为BindData()的函数并将数据集从presenter类传递到视图中,将其存储在SmartPart / View中的类成员变量中.
private System.Data.DataSet _ds = null;
public void BindData(System.Data.DataSet ds)
{
string sErr = "";
try
{
_ds = ds; // save to private member variable
// more code goes down here
}
}
我们试图将三个数据表中的每一个都绑定到Windows窗体,文本框,MaskedEditBox和Infragistics UltraComboEditor Dropdown组合框中.我们创建了三个BindingSource对象,使用VS2008 IDE为每个数据表都创建了一个.
private System.Windows.Forms.BindingSource bindsrcContract;
private System.Windows.Forms.BindingSource bindsrcLoan;
private System.Windows.Forms.BindingSource bindsrcTerms;
我们正在绑定这样的价值观
if (bindsrcContract.DataSource == null)
{
bindsrcContract.DataSource = _ds;
bindsrcContract.DataMember = “contract”;
txtContract.DataBindings.Add(new Binding("Text", bindsrcContract, "contract_id", true));
txtLateFeeAmt.DataBindings.Add(new Binding("Text", bindsrcContract, "fee_code", true));
txtPrePayPenalty.DataBindings.Add(new Binding("Text", bindsrcContract, "prepay_penalty", true));
txtLateFeeDays.DataBindings.Add(new Binding("Text", bindsrcContract, "late_days", true));
}
if (bindsrcLoan.DataSource == null)
{
bindsrcLoan.DataSource = _ds;
bindsrcLoan.DataMember = “loan”;
mskRecvDate.DataBindings.Add(new Binding("Text", bindsrcLoan, "receive_date", true));
cmboDocsRcvd.DataBindings.Add(new Binding("Value", bindsrcLoan, "docs", true));
}
当我们第一次从服务中读取数据并取回数据集时,此方法有效.该信息显示在表单的控件上,我们可以使用表单对其进行更新,然后将更改后的值传递回WCF服务来“保存”.
这是我们的问题.如果我们选择一个不同的借用密钥并对该服务进行相同的调用并获得一个新的数据集,则该数据集又包含3个表,每个表都有一行,则控件(文本框,带掩码的编辑框等)将不会使用新信息进行更新. .请注意,smartPart / View并未关闭或关闭任何东西,但在两次调用服务之间仍处于加载状态.在第二个调用中,我们没有重新绑定这些调用,而只是试图从更新的DataSet中获取要刷新的数据.
我们已经尽力想尽一切办法,但显然我们缺少了一些东西.这是我们首次使用BindingSource控件.我们已经尝试过
bindsrcContract.ResetBindings(false);
和
bindsrcContract.ResetBindings(true);
和
bindsrcContract.RaiseListChangedEvents = true;
和
for (int i = 0; i < bindsrcContract.Count; i++)
{
bindsrcContract.ResetItem(i);
}
以及再次重置DataMember属性.
bindsrcContract.DataMember = ”Contract”;
我们看了很多例子.许多示例都引用了BindingNavigator,但是由于DataTables仅包含一行,因此我们认为不需要.网格有很多示例,但是我们在这里不使用.任何人都可以指出我们要出问题的地方,或指出可以提供更多信息的资源吗?
我们使用的是VisualStudio 2008,C#和.Net 2.0,XP客户端,W2K3服务器.
提前致谢
韦斯
解决方法:
我今天有一个类似的问题,发现这可行.
private void btnCancel_Click(object sender, EventArgs e)
{
this.MyTable.RejectChanges();
this.txtMyBoundTextBox.DataBindings[0].ReadValue();
this.EditState = EditStates.NotEditting;
}