2009-03-26 3 views
2

BindingSource, DataSetTableAdapter을 사용하여 데이터 바인딩 된 컨트롤에서 삽입을 처리하는 올바른 순서는 무엇입니까? 이것은 나를 영원한 혼란으로 몰고 간다.ADO.NET 데이터 바인딩 버그 - BindingSource.EndEdit() 현재 위치 변경

새 행을 추가하는 데 사용되는 양식이 있습니다.

양식을 보여주는 전에, 나는 전화 : 저장시

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

, 내가 전화 :

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

문제는 그

  • 내가 EndEdit()를 호출하지 않는 경우

    , 현재 포커스가있는 TextBox의 변경 내용은 저장되지 않습니다.
  • EndEdit()을 호출하면 BindingSource의 현재 멤버가 방금 추가 한 행을 더 이상 가리키지 않습니다.

I 수있는 BindingSource에 의해 업데이트 된 DataTable에 반대하지만 데이터 바인딩을 사용하는 목적을 패배로 형태의 값으로 코스 호출 Insert()의. 이 기능을 사용하려면 무엇을해야합니까?

강력하게 형식화 된 데이터 집합을 사용하기 때문에 전체 데이터 집합에서 TableAdapter.Update()을 호출 할 수 있다는 것을 알고 있습니다. 테이블에 외래 키가 있는데, 데이터 바인딩이되어 있지 않으며 Insert()를 호출하기 전에 추가하고 있습니다.

답변

3

이것은 .NET 프레임 워크의 '기능'인 것으로 나타났습니다. 나는 이전에 connect.microsoft.com에 대해보고되었지만 문제는 "고치지 않을 것"으로 마감되었습니다. 하지만 workaround이 있습니다.

[...] 
     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

당신은 아마이 밖으로 지금까지 낸 것,하지만 당신은의 삽입 메소드를 호출 할 필요가 없습니다 : 나는의 ListChanged 이벤트 처리기에서 위치를 재설정하기 위해 다음과 같은 C# 코드를 사용하고

테이블 어댑터. update 메소드를 호출하면 새로운 레코드 나 변경된 레코드가 있는지를 판단하고 이에 따라 동작합니다.