2009-10-25 11 views
5

글쎄, 어떤 종류의 n00b 질문. 나는 그물과 비슷한 질문을 여기 서핑했지만, 그런 단순한 (내가 생각한) 문제에 대한 어떤 정답도 발견하지 못했다.DBGrid를 새로 고친 후 행 선택

DBGrid가 있습니다. 한 행을 선택하고이 행에 연결된 다른 데이터로 몇 가지 작업을 수행합니다. 작업이 끝나면 DBGrid가 새로 고쳐지고 행 재설정이 먼저 선택됩니다. DBGrid 데이터를 새로 고치기 전에 선택된 같은 행을 선택하려고합니다. 어떤 제안?

답변

4

새로 고침하기 전에 링크 된 데이터 세트의 현재 선택 항목을 책갈피로 저장 한 다음 나중에 책갈피를 복원하십시오.

+0

그래, 작동하는 것 같습니다. 고맙습니다! – Vlad

+1

샘플 코드를 제공해 주시겠습니까? – truthseeker

-1
RecKey:=DmFRM.ViewTBL.RecNo; 
      with DmFRM.ViewTBL do 
       begin 
        Active:=false; 
        Active:=True; 
        RecNo:=RecKey; 
       end; 
+0

나는 이것이 이미 -1이라는 것을 알고, 그래서 나는 내 것을 추가하지 않을 것이다. -1의 이유는 아마도 모든 TDataSet 자손이 RecNo를 유용하게 또는 일부 경우에 구현하지 않을 수도 있기 때문입니다. 따라서 Op의 질문에 대한 일반적인 대답으로는 유용하지 않습니다. – MartynA

+0

@MartynA : "GetBookmark는 책갈피 값을 얻기 위해 보호 된 메서드에 의존합니다. TDataSet 자손은이 메서드를 구현하여 자체 북마크 지원 유형을 제공합니다 단방향 데이터 세트는 북마크를 지원하지 않으므로 의미있는 값을 반환하지 않습니다. " –

+0

@Mahmood_M : 왜 나에게 그 말을 인용하는지 모르겠다. 단방향 데이터 세트는 북마크를 지원하지 않을 수도 있지만 TDBGrid에 직접 연결할 수없는 것과 같은 이유입니다. 즉, 그리드는 양방향으로 탐색 가능한 데이터 세트에 의존합니다. 따라서 단방향 데이터 집합을 TDBGrid에 사용하려면 그리드를 TClientDataset에 연결하고 단방향 데이터 집합에서로드해야합니다. – MartynA

4

이 답변은 Mason의 보조 보완책이 아닌 대안입니다. 필자는 데이터 세트의 RecNo 속성을 사용하는 다른 대답이 제시 되었기 때문에 추가했습니다. 모든 TDataSet 자손이 RecNo를 안정적으로 구현하거나 전혀 구현하지는 않습니다. 일부 자손은 상수 값을 반환합니다. 0 현재 행의 RecNo에 대한 값을 지정할 때 아무 작업도 수행하지 않습니다.

procedure TMyForm.DoSomethingWithDataSet(ADataSet : TDataSet); 
var 
    Bookmark : TBookmark; 
begin 
    Bookmark := ADataSet.GetBookmark; // Save your place in ADataSet 

    try 
    Screen.Cursor := crSqlWait; // Show the user that something is happening 
    Update; // update the form to make sure screen cursor updates 
    ADataSet.DisableControls; 
    // do something with ADataSet here e.g. 
    ADataSet.First; 
    while not ADataSet.Eof do begin 
     // do something with current row here, then 
     ADataSet.Next; 
    end; 
    finally 
    ADataSet.GotoBookmark(Bookmark); // Return to where you were at outset 
    ADataSet.FreeBookmark(Bookmark); 
    ADataSet.EnableControls; 
    Screen.Cursor := crDefault; // Let the user see you're done 
    end; 
end; 
+0

Boomark는 RecNo처럼 작동합니까? 안 그래? , 예를 들면 : 책갈피를 얻은 다음 선택한 레코드 이전에 일부 레코드를 삭제하고 다음에 책갈피에 가면 선택된 레코드는 삭제되기 전에 선택된 레코드와 동일하게됩니다. 즉, 북마크는 RecNo 또는 레코드의 위치 만 저장하거나 선택한 레코드에 대한 다른 정보를 저장합니까? –

+0

북마크가 특정 descendanf 또는 TDataset에서 어떻게 구현되는지에 따라 다르다고 생각하지만, 공통적 인 것이 단순히 레코드 번호 만 사용하면 놀랄 것입니다. 필자가 조사한 몇 안되는 것들은 일반적으로 구현 특정 데이터를 포함하는 버퍼를 사용합니다. 주어진 유형의 데이터 세트가 북마크를 구현하는지 여부가 의심 스럽다면 BookmarkValid 함수를 호출하십시오 (OLH 참조). – MartynA

+0

고마워, 내가 GetBookmark 및 GotoBookmark 삭제 된 레코드를 시도 : GetBookmark -> 선택 삭제 (즐겨 찾기) 기록 -> GotoBookmark, 그리고 오류가 발생했습니다 : "레코드를 찾을 수 없습니다", 나는 초마다 새로 고쳐야 테이블이 있고 내가 원하는 이 상황에서 사용자가 스크롤을 계속하려면 RecNo를 사용해야한다고 생각합니다. RecNo를 시도하고 정상적으로 작동합니다. –

관련 문제