我在WinForms应用程序中进行简单的表编辑时遇到了问题。我一定错过了一步。
我有一个DataSet
,其DataTable
连接到一个SqlDataAdapter
的数据库。 SqlCommandBuilder
上有一个SqlDataAdapter
。在表单上,有TextBoxes
绑定到DataTable
。绑定在Designer及其机器生成的语句中完成,如下所示:
this.tbLast.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.belkData, "belk_mem.last", true));
当我填充DataTable
中的行时,数据库中的值显示在文本框中,但是当我更改TextBox
的内容时,更改显然不会转到DataTable
1}}。当我尝试保存更改时,以下两个都返回null:
DataTable dtChanges = dtMem.GetChanges();
DataSet dsChanges = belkData.GetChanges();
我忘了什么?
修改 - 对mrlucmorin的回复:
保存在一个按钮下。代码是:
BindingContext[belkData, "belk_mem"].EndCurrentEdit();
try
{
DataSet dsChanges = belkData.GetChanges();
if (dsChanges != null)
{
int nRows = sdaMem.Update(dsChanges);
MessageBox.Show("Row(s) Updated: " + nRows.ToString());
belkData.AcceptChanges();
}
else { MessageBox.Show("Nothing to save.", "No changes"); }
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message);
}
我已尝试在不改变行为的情况下输入这些语句:
dtMem.AcceptChanges();
belkData.AcceptChanges();
答案 0 :(得分:0)
答案 1 :(得分:0)
*如果您正在使用BindingSource:只需执行一个简单的BindingSource.EndEdit(),您的TextBox数据就会被发送到DataTable。例如: -
_bsHeader.EndEdit();
if (_dsHeader.HasChanges())
{
DataTable dsInsert = _dsHeader.GetChanges(DataRowState.Added).Copy();
_objDal.Insert(dsInsert);
}
希望这有助于任何在这里绊倒的人。
答案 2 :(得分:0)
你的问题只是丢失了5封信......你在.last
财产上遗失了dataMember
。
BindingContext[belkData, "belk_mem"].EndCurrentEdit();
应该是
BindingContext[belkData, "belk_mem.last"].EndCurrentEdit();
另一种解决方法是在调用BindingSource
之前使用中介EndEdit()
并在其上调用GetChanges()
。
将绑定更改为:
BindingSource bs = new BindingSource();
bs.DataSource = belkData;
tbLast.DataBindings.Add("Text", bs, "belk_mem.last", true);
将保存按钮代码更改为
try
{
bs.EndEdit(); // needs to be called before getting changes.
DataSet dsChanges = belkData.GetChanges();
if (dsChanges != null)
{
int nRows = sdaMem.Update(dsChanges);
MessageBox.Show("Row(s) Updated: " + nRows.ToString());
belkData.AcceptChanges();
}
else { MessageBox.Show("Nothing to save.", "No changes"); }
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message);
}
如果您想避免使用中间人EndEdit()
,也可以在各行上致电BindingSource
。
belkData.Rows[0].EndEdit();
或者如果您正在处理多行
foreach( DataRow row in belkData.Rows )
row.EndEdit();
对于那些努力理解为什么首先需要调用EndEdit()
或EndCurrentEdit()
的人。请查看Row States and Row Versions和BindingSource.EndEdit Method上的文档。在您致电EndEdit()
之前,绑定仍处于编辑状态,并且更改仅在Proposed
DataTable
版本中可见。调用EndEdit()
会将更改移至Current
版本。只有这样DataTable
“才会有变化”。 DbDataAdapter
不看Proposed
版本。