【问题标题】:EndEdit on BindingSource updates DataTable, but rowstate still unchangedBindingSource 上的 EndEdit 更新 DataTable,但 rowstate 仍然不变
【发布时间】:2011-10-23 03:49:19
【问题描述】:

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

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

然后在保存时我执行以下操作

  bsSending.EndEdit();      

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

【问题讨论】:

  • 请将您的更新作为答案发布,然后将其标记为已接受的答案。

标签: c# .net winforms data-binding dataset


【解决方案1】:

更新:

不知道为什么,但似乎调用特定行的 EndEdit 可以解决问题。该行的父级是一个数据表,该表的数据集是 bsSending Datasource 的数据源。 调用 bsSending.EndEdit() 只会更新值,但不会更新行状态。

我在 .net 上浏览过类似问题,它们表明在绑定数据之前对数据集调用 AcceptChanges() 时,您可能会收到此错误(值已更新到数据集但行状态保持不变)。不过,我还没有看到任何问题的解决方案,所以我保留了我的解决方法

【讨论】:

    【解决方案2】:

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

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

    也许即使在 2016 年以后它也会对某人有所帮助,因为它是一个很难捕捉的错误。

    【讨论】:

      【解决方案3】:

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

      我的代码是:

      DataRow dataRow =  ((DataRowView)bindingSource1.Current).Row;
      if(dataRow.RowState != DataRowState.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();
              }
          }
      }
      

      我的解决方案:

      【讨论】:

        【解决方案4】:

        我在一种形式中遇到过类似的情况,我意识到问题出在 labels ToolTip 属性的绑定上。首先我意识到,当我将 value for nullnull 更改为某个字符串时,问题就消失了,但是在对项目进行了一些其他更改之后,问题又出现了。当我删除与 ToolTip 属性的绑定时,问题再次消失。我仍然不知道是否永远。

        【讨论】:

          【解决方案5】:

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

          问题:我在 win 表单中使用了绑定源。在表单中绑定控件时,我错过了单击并将字段绑定到(DataBindings)中表单的 Text 属性。相同的 bindingsource 字段已(正确)绑定到组合框。由于字段上的这种双重绑定,行状态从未从 Unmodified 改变。

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

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

              IsCurrentRowDirty

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-01-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-09-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多