我有一个bindingsource,它有一个数据源,是一个数据表 所有winforms控件都为绑定源添加了数据绑定
我在GUI中进行了值更改(写入控件的.text属性)
然后在Save我做以下
bsSending.EndEdit();
((DataRowView)this.bsSending.Current).Row)
现在包含新值,但RowState
仍未更改。这怎么可能?在GUI中进行值更改之前,我没有调用AcceptChanges()
答案 0 :(得分:2)
更新:
不知道为什么,但似乎调用特定行的EndEdit就可以了。行的父级是数据表,表的数据集是bsSending数据源的数据源。 调用bsSending.EndEdit()只会更新值,但不会更新rowstate。
我已经在.net上搜索了类似的问题,他们指出在绑定数据时在数据集上调用AcceptChanges()时,您可能会收到此错误(值更新为数据集但rowstate保持不变)。我没有看到任何问题的解决方案,所以我保留了我的解决方案
答案 1 :(得分:1)
我遇到了一种形式的类似情况,我意识到问题在于对标签ToolTip属性进行绑定。首先我意识到,当我将 null 的值从 null 更改为某个字符串时,问题就会消失,但在对项目进行其他一些更改后,问题再次出现。当我删除与ToolTip属性的绑定时,问题再次消失。我仍然不知道是否永远。
答案 2 :(得分:1)
我知道这是老帖子。
它可以通过直接调用DataRowView.EndEdit
来解决,但在我的情况下,我找到了确切的原因:
我意外地将一个控件的两个属性绑定到不同的列。
(在我的情况下,我同时将Devexpress'TextEdit
控件 - EditValue
和Text
属性绑定到底层表的不同列。)
也许它会帮助某人即使在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。
答案 6 :(得分:0)
@Jan Strnad的回答启发了我并帮助我解决了我的问题。
问题:我在win表单中使用绑定源。当绑定表单中的控件时,我想念单击并将字段绑定到(DataBindings)中表单的Text属性。相同的bindingsource字段被绑定(正确)到组合框。由于字段上的这种双重绑定,rowstate从未从未修改更改。
修复:当行没有更新并使用绑定源时,请先检查绑定是否正确放置。