TextBox更改未保存到DataTable

时间:2012-10-26 16:33:02

标签: c# winforms data-binding

我在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();

3 个答案:

答案 0 :(得分:0)

创建DataSourceUpdateMode.OnPropertyChanged实例时,您错过了Binding

答案 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 VersionsBindingSource.EndEdit Method上的文档。在您致电EndEdit()之前,绑定仍处于编辑状态,并且更改仅在Proposed DataTable版本中可见。调用EndEdit()会将更改移至Current版本。只有这样DataTable“才会有变化”。 DbDataAdapter不看Proposed版本。