BindingSource上的EndEdit更新DataTable,但rowstate仍未更改

时间:2011-08-09 11:36:25

标签: c# .net winforms data-binding dataset

我有一个bindingsource,它有一个数据源,是一个数据表 所有winforms控件都为绑定源添加了数据绑定

我在GUI中进行了值更改(写入控件的.text属性)

然后在Save我做以下

  bsSending.EndEdit();      

((DataRowView)this.bsSending.Current).Row)现在包含新值,但RowState仍未更改。这怎么可能?在GUI中进行值更改之前,我没有调用AcceptChanges()

7 个答案:

答案 0 :(得分:2)

更新:

不知道为什么,但似乎调用特定行的EndEdit就可以了。行的父级是数据表,表的数据集是bsSending数据源的数据源。 调用bsSending.EndEdit()只会更新值,但不会更新rowstate。

我已经在.net上搜索了类似的问题,他们指出在绑定数据时在数据集上调用AcceptChanges()时,您可能会收到此错误(值更新为数据集但rowstate保持不变)。我没有看到任何问题的解决方案,所以我保留了我的解决方案

答案 1 :(得分:1)

我遇到了一种形式的类似情况,我意识到问题在于对标签ToolTip属性进行绑定。首先我意识到,当我将 null 的值从 null 更改为某个字符串时,问题就会消失,但在对项目进行其他一些更改后,问题再次出现。当我删除与ToolTip属性的绑定时,问题再次消失。我仍然不知道是否永远。

答案 2 :(得分:1)

我知道这是老帖子。 它可以通过直接调用DataRowView.EndEdit来解决,但在我的情况下,我找到了确切的原因:

我意外地将一个控件的两个属性绑定到不同的列。 (在我的情况下,我同时将Devexpress'TextEdit控件 - EditValueText属性绑定到底层表的不同列。)

也许它会帮助某人即使在2016年以上,因为这是一个讨厌的bug。

答案 3 :(得分:0)

是的,我有相同的经历。我正在使用Visual Studio 2010和.NET Framework v.4.0。我正在使用绑定到DataTable的DataGridView控件。

如果用户在单元格值仍处于编辑模式时尝试关闭表单,我希望DataGrid结束编辑模式并询问用户是否要保存或丢失更改。

这是适用于我的代码:

if (dgv.IsCurrentCellInEditMode)
{
                dgv.EndEdit();
                updatedData.Rows[dgv.CurrentCell.RowIndex].EndEdit();
}
            if (updatedData.GetChanges() != null && updatedData.GetChanges().Rows.Count > 0)
{
     // if there are changes, update the dataset
}

我想指出我需要在DataGridView上调用两个--EndEdit()来让它结束编辑。然后在DataTable上调用EndEdit()以标记“已修改”行。

答案 4 :(得分:0)

我有类似的问题。我在第一个标签页上有一个网格,在第二个标签页上有文本框,所有标签都绑定到同一个绑定源。 我更改行内容,内容在网格中更改,但行开始是未更改。

我的代码是:

DataRow dataRow =  ((DataRowView)bindingSource1.Current).Row;
if(dataRow.RowState != DataRowState.Modified)

我希望有一个Modified rowState。

缺少的代码是:

bindingSource1.EndEdit();

这里的整个解决方案:

private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (tabControl1.SelectedIndex == 0)
    {
        bindingSource1.EndEdit();
        DataRow dataRow =  ((DataRowView)bindingSource1.Current).Row;
        if(dataRow.RowState != DataRowState.Modified)
        {
            return;
        }
        DialogResult userOption = MessageBox.Show("Save?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        if (userOption == System.Windows.Forms.DialogResult.Yes)
        {
            Save();
        }
    }
}

我的解决方案:

答案 5 :(得分:0)

  

要以编程方式提交行更改,请调用表单的Validate方法。如果您的数据源是BindingSource,您还可以调用BindingSource.EndEdit。

IsCurrentRowDirty

答案 6 :(得分:0)

@Jan Strnad的回答启发了我并帮助我解决了我的问题。

问题:我在win表单中使用绑定源。当绑定表单中的控件时,我想念单击并将字段绑定到(DataBindings)中表单的Text属性。相同的bindingsource字段被绑定(正确)到组合框。由于字段上的这种双重绑定,rowstate从未从未修改更改。

修复:当行没有更新并使用绑定源时,请先检查绑定是否正确放置。