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
控件 – EditValue
和Text
属性绑定到底层表的不同列)。
也许它会在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从未更改为未修改 。
修复 :当行不更新并且您使用绑定源时,首先检查绑定是否正确放置。