ADO.NET数据绑定错误 - BindingSource.EndEdit()更改当前位置

时间:2009-03-26 16:42:20

标签: winforms data-binding dataset bindingsource tableadapter

使用BindingSourceDataSetTableAdapter从数据绑定控件处理插入的正确顺序是什么?这引起了我永远的困惑。

我有一个用于添加新行的表单。

在显示表格之前,我打电话给:

bindingSource.AddNew();
bindingSource.MoveLast();

保存后,我致电:

bindingSource.EndEdit();
tableAdapter.Insert([the row given to me as bindingSource.Current]);

问题在于

  • 如果我不调用EndEdit(),则不保存带有当前焦点的TextBox的更改
  • 如果我打电话给EndEdit(),BindingSource的当前成员不再指向我刚刚添加的行。

我当然可以使用表单中的值来调用Insert(),而不是使用BindingSource更新的DataTable,但是这会破坏使用数据绑定的目的。我需要做些什么才能使其正常工作?

我知道我可以在整个DataSet上调用TableAdapter.Update(),因为我使用的是强类型DataSet。我在表中没有数据绑定的外键,并且我在调用Insert()之前添加了。

2 个答案:

答案 0 :(得分:3)

事实证明,这是.NET框架的“特征”。我之前曾在connect.microsoft.com上报告,但该问题因“无法修复”而被关闭。但是有一个workaround

我使用以下C#代码重置ListChanged事件处理程序中的位置:

    [...]
        bindingSource.ListChanged += 
            new ListChangedEventHandler(PreserveCurrentPosition);
    [...]


    private void PreserveCurrentPosition(object sender, ListChangedEventArgs e)
    {
        if (e.ListChangedType == System.ComponentModel.ListChangedType.ItemAdded &&
            ((BindingSource)sender).Count - e.NewIndex > 1)
        {
            ((BindingSource)sender).Position = e.NewIndex;
        }
    }

答案 1 :(得分:-1)

您可能已经想到了这一点,但您不需要调用表适配器的insert方法。只需调用更新方法,它将确定是否有任何新的或更改的记录并采取相应的行动。