使用BindingSource,DataSet和TableAdapter从数据绑定控件处理插入的正确顺序是什么?这引起了我永远的困惑。
我有一个用于添加新行的表单。
在显示表格之前,我打电话给:
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()之前添加了。
答案 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方法。只需调用更新方法,它将确定是否有任何新的或更改的记录并采取相应的行动。