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

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

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

然后在保存我做以下

bsSending.EndEdit(); 

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

更新:

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

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

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

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

我意外地将一个控件的两个属性绑定到不同的列。 (在我的例子中,我同时将Devexpress的TextEdit控件 – EditValueText属性绑定到底层表的不同列)。

也许它会在2016年以后帮助某人,因为这是一个令人讨厌的虫子。

是的,我有相同的经历。 我正在使用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()以标记“已修改”行。

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

我的代码是:

 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(); } } } 

我的解决方案

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

见IsCurrentRowDirty

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

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

修复 :当行不更新并且您使用绑定源时,首先检查绑定是否正确放置。