1. AcceptChange() 메서드에 대해서
dt_Temp.AcceptChange()
문제 상황 : DB에서 datagrid contol에 불러온 테이블의 행의 인덱스를 할당하려고 했는데(FocusedRowHandle 메서드를 이용하여) 맞지 않는 값이 들어가는 상황
int focusedRowIndex1 = gv_List.FocusedRowHandle;
focusedRowIndex1에 이상한 값이 들어가는 상황에서 그 행에 값을 정상적으로 읽지 못하는 문제였습니다.
해결 : 그리드에 데이터를 로드해준후 AccpetChange()메서드를 이용하여 dataRow의 객체 속성의 값을 바꿔줌으로써 해결
정리 : datarow에는 RowState라는 DataRow 객체의 속성이 존재하고 해당 행(DataRow)이 DataTable에서 어떤 상태에 있는지를 나타냅니다.
DataRowState 값은 열거형으로 총 5개의 값을 갖습니다.
1. Unchanged : 데이터가 DataTable에 추가된 후 또는 AcceptChange 메서드가 호출된 후에 변경되지 않은 상태를 나타냅니다. -> 이 상태에서 인덱스의 값이 정상적으로 할당되어 문제를 해결했습니다.
2. Added : 데이터가 DataTable에 추가된 후 아직 AcceptChange 메서드가 호출되지 않은 상태를 나타냅니다.
3. Modified : 데이터가 DataTable에 추가된 후 변경된 상태를 나타냅니다.
4. Deleted : 데이터가 DataTable에서 삭제된 후 아직 AcceptChange 메서드가 호출되지 않은 상태를 나타냅니다.
5. Detached : 데이터가 DataTable에 속하지 않거나, DataTable에서 제거된 상태를 나타냅니다. 즉, 행이 아직 DataTable에 추가되지 않았거나, DataTable에서 제거된 상태입니다.
DataTable에 바인딩된 값의 DataRow의 값은 각각의 메서드( dt_Temp.Rows.Add(), row.Delete()....)실행후 각기 다른 RowState값을 갖는데 AcceptChange메서드를 이용하여 RowState의 상태를 Unchange로 만들어 줌으로써(커밋해줌으로써) 데이터를 정상적으로 조작할 수 있었습니다.
결론 : DB에서 DataGrid에 데이터를 바인딩한후 데이터를 조작하기전에 acceptChange()메서드를 이용하여 DataRow의 상태를 Unchanged상태로 변경!
2. 그리드 컨트롤에서 저장방법 변경
문제 상황 : 기존의 코드는 포커스된 행에 대해서만 저장하는 방식 : 다른행에서 변경된 사항이 있으면 저장되지 않음 -> 수정, 추가된 모든 행을 저장하는 방식
해결 : 플래그 기능을 이용하여 변경된 사항이 있을 때만 저장을 수행하도록 구현
단계별 구현
1. 플래그 변수 추가 : 변수 사항을 추적하는 플래그 변수를 추가합니다.
private bool isDataChanged = false; // 변경 플래그