并发错误WinForms绑定源导航器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发错误WinForms绑定源导航器相关的知识,希望对你有一定的参考价值。
我有一个包含客户信息的表单,每页需要处理一个事务。我正在使用绑定导航器来管理我的分页。
除了某些情况,它适用于所有情况。在它不起作用的情况下,我必须打开一个不同的窗口来查找信息并将其返回到主窗体。这是代码:
// save current work
updateDataTable();
// Open a window and get new customer info
// CurrentCustomer is returned from the opened window
using (SqlConnection cx = new SqlConnection(GetConnectionString()))
{
DataRowView dataRow = (DataRowView)procBindingSource.Current;
dataRow.BeginEdit();
dataRow["CUSTOMER"] = CurrentCustomer;
dataRow.EndEdit();
updateDataItems();
SqlCommand cmd = new SqlCommand(
@" select acct_no from cust_processing where id = @id ", cx);
cmd.Parameters.AddWithValue("@id", (int)dataRow["ID"]);
cx.Open();
var results = cmd.ExecuteScalar();
if (results != null)
{
dataRow.BeginEdit();
dataRow["ACCT_NO"] = results.ToString();
dataRow.EndEdit();
updateDataItems(); <------ CONCURRENCY ERROR
}
}
我得到的错误是并发错误。我想我可能有多个版本的行?我以为我通过调用updateDataTable()来确保我在该行的最新版本上。我是唯一的用户,所以我知道我自己创造了这个问题。
这是我的更新方法,当我更改页面或保存并退出或想要写入提交数据时调用它:
void updateDataItems()
{
this.procBindingSource.EndEdit();
this.procTableAdapter.Update(xyzDataSet);
xyzDataSet.AcceptChanges();
}
我尝试从各个地方执行updateDataItems,例如在我分配dataRow [“ACCT_NO”] = results.ToString()之后或者在分配之前和之后。
我几乎要猜测并检查所以任何想法,帮助和建议将被赞赏和+1。
答案
好的 - 所以问题是我试图从程序中更新当前行并使用绑定导航器。他们没有正常合作。
解决方案是在表单设计器中向表单添加一个文本框,并设置visible = false并将其绑定到ACCT_NO。一旦我从其他表单获得结果,我只需要将ACCT_NO文本框的.text属性设置为新值,绑定导航器就可以正确管理我的所有更新。
txtAcct_No.text = results.ToString();
以上是关于并发错误WinForms绑定源导航器的主要内容,如果未能解决你的问题,请参考以下文章
Winforms DataGridView 数据绑定到复杂类型/嵌套属性
为啥覆盖 .GetHashCode 会清除 WinForms 中的这些数据绑定值?