데이터베이스가로드 될 때 dbgrid 컨트롤에서 특정 셀의 내용을 수정하려고합니다. 예를 들어, "금지됨"과 같으면 데이터베이스 필드를 dbgrid에 표시하지 않도록 할 수 있습니다. 내가 할 수있는 방법이 있니?DBGrid 셀 내용이 표시되기 전에 수정하십시오.
답변
당신은 DataSetNotifyEvent Afteropen
DBGrid.Datasource.Dataset.Afteropen 사용할 수 있습니다 =
을 당신은있는 필드를 숨길 수 있습니다 :
경우 조건 다음 DBGrid.columns [X] .visible : = false
다른 방법으로 특정 셀의 일부 내용을 덮어 쓰거나 삭제하기 위해 OnDrawColumnCell 이벤트의 상태를 확인할 수 있습니다.
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. 때문에 제안은 당신이 피해야 할 것입니다.
나는 O.D.를 받아 들였다. 그 대답은 효과가 있었기 때문에 많은 도움이되었습니다. 모든 대답에 +1. 당신의 도움을 주셔서 감사합니다. –
원래의 질문에가는 :
를 사용하여 필드의 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;
데이터 세트의 Hookup OnAfterOpen 이벤트입니다. 숨겨진 필드를 확인하고 visible 속성을 false로 설정하고 DBGrid를 행 (튜플)를 포함하지 않도록 내가 그리드에 데이터를 제공하는 쿼리를 수정 것 그들에게
건배
를 표시 할 것이다 '금지 된'문자열이 있어야합니다. 이것은 데이터베이스에서 이미 검색된 후에 데이터를 표시하지 않으려 고 노력하는 것보다 훨씬 쉽습니다.
나는 가장 좋은 방법은 필드를 선택하지 않을 것이라고 생각 WHERE SOME_VALUE 많은 DATABASE_TABLE
감사 FROM = "금지". 그것은 일했다 :) –