EndEdit on BindingSource更新DataTable,但rowstate保持不变
本文关键字:rowstate on BindingSource 更新 DataTable EndEdit | 更新日期: 2023-09-27 18:04:50
我有一个bindingsource,它有一个数据源,它是一个数据表。
所有的winforms控件都添加了databindings到bindingsource
我在GUI中做了一个值更改(写入控件的。text属性)
然后在Save i执行以下操作
bsSending.EndEdit();
((DataRowView)this.bsSending.Current).Row)
现在包含了新的值,但RowState
仍然没有改变。这怎么可能呢?在GUI
AcceptChanges()
进行任何调用UPDATE:
不知道为什么,但似乎调用特定行的EndEdit就能奏效。该行的父行是一个数据表,而表的数据集是bsSending数据源的数据源。调用bssend . enddit()只更新值,但不更新行状态。
我在。net上浏览了类似的问题,他们指出,在绑定数据之前调用数据集上的AcceptChanges(),那么你可能会得到这个错误(更新到数据集的值,但rowstate保持不变)。但是,我还没有看到任何解决这个问题的方法,所以我保留了我的变通方案
我知道这是旧的帖子。它可以通过直接调用DataRowView.EndEdit
来解决,但在我的情况下,我找到了确切的原因:
我不小心将一个控件的两个属性绑定到不同的列。(在我的情况下,我同时绑定Devexpress的TextEdit
控件- EditValue
和Text
属性到底层表的不同列)。
也许它会帮助一些人,即使在2016+,因为这是一个讨厌的bug。
我也有类似的问题。我有一个网格在第一个选项卡页面和第二个选项卡页面上的文本框,所有绑定到相同的绑定源。我改变了行内容,内容在网格中得到了改变,但行开始是不变的。
我的代码是: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();
}
}
}
我的解决方案:
我在一个表单中遇到过类似的情况,我意识到问题是绑定到标签的工具提示属性。首先我意识到,当我将null的值从null更改为某个字符串时,问题消失了,但在对项目进行了一些其他更改后,问题再次出现。当我删除对工具提示属性的绑定时,问题又消失了。我仍然不知道是否永远。
@Jan Strnad的回答启发了我,帮助我解决了我的问题。
问题:我在win表单中使用绑定源。在表单中绑定控件时,我在(DataBindings)中没有单击并绑定一个字段到表单的Text属性。相同的bindingsource字段被(正确地)绑定到一个组合框。由于字段上的这种双重绑定,row状态从未从Unmodified更改。
修复:当行不更新并且您使用绑定源时,首先检查绑定是否正确放置。
是的,我也有同样的经历。我使用的是Visual Studio 2010和。net Framework v.4.0。我正在使用绑定到数据表的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
}
我想指出的是,我需要调用- EndEdit()在DataGridView上让它结束编辑。然后在DataTable上调用EndEdit()将行标记为'modified'。
要以编程方式提交行更改,请调用表单的Validate方法。如果你的数据源是BindingSource,你也可以调用BindingSource. endedit。
看到IsCurrentRowDirty