Q&A

  • dbgrid에서 연속적으로 row를 선택하고자 할 때는 어떻게 ?
dbgrid에서 연속적으로 row들을 선택하고자 할 때는 어떻게 해야 합니까 ?

dbgrid의 options property에는 multi select 부분을 선택하는 부분이
있는데, 도움말을 보면 non contiguous row selection을 의미하는 것으로,
Control Key를 누른 상태에서 각 row를 선택시 비연속적으로 row선택이
가능합니다.

그런데 Shift key를 누른 상태에서 연속적으로 row들을 선택하고자 할 때는
어떻게 해야할 지를 모르겠습니다.
알려 주시기 바랍니다.
2  COMMENTS
  • Profile
    이성찬 2002.05.02 20:36

    할 수 없습니다. -_-;;
    그런 기능을 구현하고 싶으시면 dbgrid 의 소스를 변경하셔야 되구요,
    간단히 구현하시려면 전역변수를 2개 잡으신후 처음 Shift+Mouse Click 할당시의 레코드넘버를 기억하셔서 while 루프나 for 루프를 이용하여 Select 를 지정하는 수 밖에 없습니다.
    아니면 express 같은 서드파티 제품을 쓰시던가요...
    이상 도움이 안되는 답변이었습니다.
  • Profile
    신호성 2002.05.02 21:36
    var
      GvFirstSelectBookmark  : TBookmark;


    // Multi Select 처리
    procedure GfMultiSelectProcess(DBGrid:TDBGrid);
    var
      Direction       : Integer;
      TempBookmark    : TBookmark;
      CurrentBookmark : TBookmark;
    begin
      with  (DBGrid.DataSource.DataSet as TDBDataSet) do
      begin
        if (IsEmpty) or (GvFirstSelectBookmark = nil) then
        begin
          GvFirstSelectBookmark := GetBookmark;
          Exit;
        end;

        if (dgMultiSelect in DBGrid.Options)  then
        begin
          if GetKeyState(VK_SHIFT) < short(0) then
          begin
            TempBookmark     := nil;
            CurrentBookmark  := GetBookmark;

            Direction  := CompareBookmarks(GvFirstSelectBookmark,CurrentBookmark);
            if Direction = 0 then Exit;
            GotoBookMark(GvFirstSelectBookmark);
            try
              DBGrid.DataSource.DataSet.DisableControls;

              while (not EOF) and (not BOF) do
              begin
                DBGrid.SelectedRows.CurrentRowSelected := True;
                if Direction > 0 then
                  prior
                else
                  Next;
                TempBookmark := GetBookmark;
                if CompareBookmarks(TempBookmark, CurrentBookmark) = 0 then break;
              end;
            finally
              DBGrid.DataSource.DataSet.EnableControls;
              FreeBookmark(CurrentBookmark);
              FreeBookmark(GvFirstSelectBookmark);
              if Assigned(TempBookmark) then
                FreeBookmark(TempBookmark);
            end;
          end;
          GvFirstSelectBookmark := GetBookmark;
        end;
      end;
    end;




    // DBGrid CellClick Event에서 MultiSelect처리 호출

    procedure TForm1.DBGrid1CellClick(Column: TColumn);
    begin
      GfMultiSelectProcess(TDBGrid(Column.Grid));
    end;