如何:在保存数据前提交数据绑定控件中正在进行的编辑

编辑数据绑定控件中的值时,用户必须离开当前记录才能将更新后的值提交给该控件绑定到的基础数据源。 将项从“数据源”窗口拖到窗体中时,第一个拖放的项会生成 BindingNavigator 的保存按钮单击事件代码。 此代码调用 BindingSourceEndEdit 方法。 因此,只对添加到窗体的第一个 BindingSource 生成对 EndEdit 方法的调用。

EndEdit 调用将提交当前正在编辑的任何数据绑定控件中的所有更改。 因此,如果焦点仍在数据绑定控件上并且您单击了**“保存”**按钮,则会先提交该控件中所有挂起的编辑,再执行真正的保存(TableAdapterManager.UpdateAll 方法)。

即使用户尝试在不提交更改的情况下保存数据,也可将应用程序配置为自动提交更改,作为保存进程的一部分。

备注

设计器只向拖放到窗体上的第一项添加 BindingSource.EndEdit 代码。因此,必须对窗体上的每个 BindingSource 添加一行调用 EndEdit 方法的代码。可以手动对每个 BindingSource 添加一行调用 EndEdit 方法的代码。另外,也可以向窗体添加 EndEditOnAllBindingSources 方法并在执行保存之前调用该方法。

下面的代码使用LINQ(语言集成查询) 查询循环访问所有 BindingSource 组件并对窗体上的每个 BindingSource 调用 EndEdit 方法。

对窗体上的所有 BindingSource 组件调用 EndEdit

  1. 将以下代码添加到包含 BindingSource 组件的窗体中。

    Private Sub EndEditOnAllBindingSources()
        Dim BindingSourcesQuery = From bindingsources In Me.components.Components 
                      Where (TypeOf bindingsources Is Windows.Forms.BindingSource) 
                      Select bindingsources
    
        For Each bindingSource As Windows.Forms.BindingSource In BindingSourcesQuery
            bindingSource.EndEdit()
        Next 
    End Sub
    
    private void EndEditOnAllBindingSources()
    {
        var BindingSourcesQuery =
            from Component bindingSources in this.components.Components
            where bindingSources is BindingSource
            select bindingSources;
    
        foreach (BindingSource bindingSource in BindingSourcesQuery)
        {
            bindingSource.EndEdit();
        }
    }
    
  2. 在第一个调用的紧前面添加以下代码行,以保存窗体的数据(TableAdapterManager.UpdateAll() 方法):

    Me.EndEditOnAllBindingSources()
    
    EndEditOnAllBindingSources();
    

请参见

参考

BindingSource 组件概述

概念

分层更新概述

TableAdapterManager 概述

TableAdapter 概述