2

我在 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. 当我尝试保存更改时,以下两个都返回 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();
4

3 回答 3

0

*如果您也使用 BindingSource:只需执行一个简单的 BindingSource.EndEdit(),您的 TextBox 数据就会发送到 DataTable。例子:-

_bsHeader.EndEdit();
if (_dsHeader.HasChanges())
{
    DataTable dsInsert = _dsHeader.GetChanges(DataRowState.Added).Copy();
    _objDal.Insert(dsInsert);
}

希望这可以帮助任何在这里绊倒的人。

于 2013-03-13T08:45:27.877 回答
0

创建Binding实例时缺少DataSourceUpdateMode.OnPropertyChanged 。

于 2012-10-26T16:51:25.723 回答
0

您的问题只是缺少 5 个字母....您在财产上失踪.lastdataMember

BindingContext[belkData, "belk_mem"].EndCurrentEdit();

本来应该

BindingContext[belkData, "belk_mem.last"].EndCurrentEdit();

另一种解决方法是使用中介BindingSourceEndEdit()在调用之前调用它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(),绑定保持在编辑状态,并且更改仅ProposedDataTable. 调用EndEdit()将更改移动到Current版本。只有这样,DataTable“有变化”。DbDataAdapter的不看Proposed版本。

于 2016-10-21T19:12:05.400 回答