2011-02-04 4 views

답변

3

당신은 DataSetNotifyEvent Afteropen

DBGrid.Datasource.Dataset.Afteropen 사용할 수 있습니다 =

을 당신은있는 필드를 숨길 수 있습니다 :

경우 조건 다음 DBGrid.columns [X] .visible : = false

다른 방법으로 특정 셀의 일부 내용을 덮어 쓰거나 삭제하기 위해 OnDrawColumnCell 이벤트의 상태를 확인할 수 있습니다.

+1

감사 FROM = "금지". 그것은 일했다 :) –

3

DataSet 이벤트를 사용하여 UI를 동기화하는 것은 좋지 않습니다. 데이터 로직 이벤트를 비즈니스 논리에서 분리하여 DataSource 이벤트에 의존 할 수 있습니다.

DataSet의 상태가 dsInactive에서 dsBrowse로 변경됨에 따라 DataSource OnState 변경에 의존하여 데이터가 데이터베이스에서로드 될 때 UI와 관련된 모든 것을 만들 수 있습니다.

코드가 필요 이상으로 실행되는 것을 피하기 위해 Auxiliar 필드를 사용하여 이전 상태를 추적 할 수 있습니다. 예를 들어

(테스트되지 않은 코드)

procedure TForm1.DataSource1StateChange(Sender: TObject); 
begin 
    if (DataSource1.State = dsBrowse) and (not FUIStateInSync) then 
    begin 
    //dataset is open, change UI accordingly 
    DBGrid1.Columns[0].Visible := SomeCondition(); 
    //this will prevent the code to be executed again 
    //as state comes to dsBrowse after posting changes, etc. 
    FUIStateInSync := True; 
    end 
    else if (DataSource1.State = dsInactive) then 
    FUIStateInSync := False; //to let it happen again when opened. 
end; 

나는 당신이 허용 대답이 경우에도이 게시 O.D. 때문에 제안은 당신이 피해야 할 것입니다.

+0

나는 O.D.를 받아 들였다. 그 대답은 효과가 있었기 때문에 많은 도움이되었습니다. 모든 대답에 +1. 당신의 도움을 주셔서 감사합니다. –

5

원래의 질문에가는 :

를 사용하여 필드의 OnGetText 이벤트가 프리젠 테이션을 위해 데이터베이스에 저장되어있는 것과 다른 값을 제공 할 수 있습니다.

DisplayText 부울 매개 변수는 값이 사용자에게 표시되어야하는 경우 True이고 다른 값으로 값이 필요한 경우 False가됩니다.

procedure TForm1.SQLQuery1Field1GetText(Sender: TField; 
    var Text: string; DisplayText: Boolean); 
begin 
    if (Sender.AsString = 'forbidden') and (DisplayText) 
    and (PrivilegeLevel(CurrentUser) < 10) then 
    Text := '********' 
    else 
    Text := Sender.AsString; 
end; 
2

데이터 세트의 Hookup OnAfterOpen 이벤트입니다. 숨겨진 필드를 확인하고 visible 속성을 false로 설정하고 DBGrid를 행 (튜플)를 포함하지 않도록 내가 그리드에 데이터를 제공하는 쿼리를 수정 것 그들에게

건배

2

를 표시 할 것이다 '금지 된'문자열이 있어야합니다. 이것은 데이터베이스에서 이미 검색된 후에 데이터를 표시하지 않으려 고 노력하는 것보다 훨씬 쉽습니다.

1

나는 가장 좋은 방법은 필드를 선택하지 않을 것이라고 생각 WHERE SOME_VALUE 많은 DATABASE_TABLE