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

EndEdit on BindingSource更新DataTable,但rowstate保持不变

中进行值更改之前,我没有对AcceptChanges()进行任何调用

UPDATE:

不知道为什么,但似乎调用特定行的EndEdit就能奏效。该行的父行是一个数据表,而表的数据集是bsSending数据源的数据源。调用bssend . enddit()只更新值,但不更新行状态。

我在。net上浏览了类似的问题,他们指出,在绑定数据之前调用数据集上的AcceptChanges(),那么你可能会得到这个错误(更新到数据集的值,但rowstate保持不变)。但是,我还没有看到任何解决这个问题的方法,所以我保留了我的变通方案

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

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

也许它会帮助一些人,即使在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