방법: 데이터 바인딩된 컨트롤에서 데이터를 저장하기 전에 In-Process 편집 커밋
데이터 바인딩된 컨트롤의 값을 편집할 때는 현재 레코드에서 빠져 나와서 컨트롤이 바인딩된 내부 데이터 소스에 업데이트된 값을 커밋해야 합니다. 항목을 데이터 소스 창에서 폼으로 끌어서 놓을 때, 첫 번째로 끌어서 놓는 항목이 BindingNavigator의 저장 단추 클릭 이벤트에 코드를 생성합니다. 이 코드는 BindingSource의 EndEdit 메서드를 호출합니다. 따라서 EndEdit 메서드 호출은 폼에 추가되는 첫 번째 BindingSource에 대해서만 생성됩니다.
EndEdit 호출은 현재 편집 중인 모든 데이터 바인딩된 컨트롤에서 처리 중인 모든 변경 내용을 커밋합니다. 따라서 데이터 바인딩된 컨트롤에 아직 포커스가 있을 때 저장 단추를 클릭하면 해당 컨트롤의 보류 중인 편집 내용이 모두 실제 저장 전에 커밋됩니다(TableAdapterManager.UpdateAll 메서드).
사용자가 변경 내용을 커밋하지 않고 데이터를 저장하려고 하더라도 저장 프로세스의 일부로 변경 내용이 자동으로 커밋되도록 응용 프로그램을 구성할 수 있습니다.
참고
디자이너에서는 폼으로 끌어서 놓은 첫 번째 항목에 대해서만 BindingSource.EndEdit 코드가 추가됩니다.따라서 폼의 각 BindingSource마다 EndEdit 메서드를 호출하는 코드 줄을 추가해야 합니다.각 BindingSource마다 EndEdit 메서드를 호출하는 코드 줄을 직접 추가할 수 있습니다.또는 EndEditOnAllBindingSources 메서드를 폼에 추가하고 저장하기 전에 이 메서드를 호출할 수도 있습니다.
다음 코드에서는 LINQ(통합 언어 쿼리) 쿼리를 사용하여 모든 BindingSource 구성 요소를 반복하고 폼의 각 BindingSource에 대해 EndEdit 메서드를 호출합니다.
폼의 모든 BindingSource 구성 요소에 대해 EndEdit를 호출하려면
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(); } }
코드 줄을 추가하여 폼의 데이터를 저장하는 호출의 바로 앞에 다음 코드 줄을 추가합니다(TableAdapterManager.UpdateAll() 메서드).
Me.EndEditOnAllBindingSources()
EndEditOnAllBindingSources();