cxGrid에서 현재 셀 입력 데이터 자동 저장 방법

cxGrid를 사용한 데이터 입력 인터페이스에서 사용자가 셀에 데이터를 입력한 후 Enter 키를 누르지 않고 도구 모음의 저장 버튼을 클릭하여 데이터를 제출하면, 현재 입력한 내용이 손실되고 입력 전의 값으로 돌아가는 문제가 발생합니다.

커뮤니티에서 도움을 요청한 결과, 많은 개발자들의 지원을 받아 이 문제를 해결할 수 있었습니다. 이 경우 cxGrid의 구현 메커니즘과 관련이 있으며, 도구 모음의 버튼을 클릭할 때 포커스 변환이 발생하지 않아 cxGrid는 사용자가 입력을 완료하지 않았다고 간주하고 계속해서 입력을 기다립니다.

이 문제를 이해한 후에는 몇 가지 해결 방법이 있습니다. 하나는 저장 버튼을 클릭할 때 Self.SetFocus를 강제로 호출하는 방법(Self는 Form을 의미)이고, 다른 하나는 cxGrid가 제공하는 메서드를 호출하여 데이터를 강제로 제출하는 방법입니다.

아래 코드는 다양한 해결 방법을 보여줍니다:

procedure Tfrm_Main.UpdateGridData(aTableView: TcxGridDBTableView);
var
  AValue: Variant;
begin
  if aTableView.DataController.IsEditing then
  begin
    // 첫 번째 방법
    // AValue := TcxCustomTextEdit(aTableView.DataController.Controller.EditingController.Edit).Text;
    // aTableView.dataController.DataSet.Edit;
    // aTableView.dataController.DataSet.FieldByName('fname').AsString := AValue;
    // aTableView.dataController.DataSet.Post;

    // 두 번째 방법
    // aTableView.Controller.EditingController.HideEdit(True);

    // 세 번째 방법
    // aTableView.Controller.EditingController.Edit.PostEditValue;

    // 네 번째 방법
    // aTableView.dataController.DataSet.Post;

    // 다섯 번째 방법
    aTableView.dataController.UpdateData;
  end;
end;

매개변수는 cxGrid의 뷰입니다. 아래 그림에서 ShiTableView를 가리킵니다.

저장 버튼을 클릭할 때 이 메서드를 실행하여 cxGrid에 데이터를 강제로 제출합니다.

UpdateGridData(ShiTableView);

이 해결책은 간단해 보이지만, 저는 몇 시간이 걸렸습니다. 사용자가 처음으로 데이터를 입력할 때 위 동작을 수행하면 데이터가 저장되지 않고, 두 번째 이후에는 정상적으로 작동하는 현상이 발생했습니다. 원인을 조사한 결과, ShiTableView에 ShiTableViewFocusedRecordChanged 이벤트가 사용되고 있었기 때문입니다.

이 이벤트에서 다른 cxGrid에 필요한 데이터를 로드하는 작업을 수행했는데, 바로 이 이벤트가 첫 번째 실행 시 오류를 발생시켰습니다. 코드에서 UpdateData 실행 전에 이 이벤트를 제거하고 실행 후에 다시 복원했습니다. 최종 코드는 다음과 같습니다:

procedure Tfrm_Main.actSaveExecute(Sender: TObject);
begin
  DisableFocusedRecordChanged;
  try
     // Self.SetFocus; // cxGrid 현재 입력 내용을 강제 저장하는 방법 중 하나
     UpdateGridData(ShiTableView); // cxGrid 현재 입력 내용을 강제 저장하는 방법 중 하나
     SaveData;
  finally
     EnableFocusedRecordChanged;
  end;
end;

마지막으로 SetFocus와 UpdateData의 차이점을 설명하겠습니다:

SetFocus를 사용하면 cxGrid의 포커스가 사라지며, 사용자가 cxGrid를 계속 작업하려면 마우스로 클릭하여 cxGrid에 다시 포커스를 주어야 합니다. 연속 입력 시 불편합니다. 반면 UpdateData 메서드는 더 많은 코드를 작성해야 하여 코드 결합도가 증가합니다. 장단점을 고려하여 저는 최종적으로 UpdateData 방법을 선택했습니다.

태그: cxGrid Delphi 데이터입력 자동저장 컨트롤러

6월 16일 18:38에 게시됨