Изменить содержимое ячейки DBGrid перед ее отображением - PullRequest
3 голосов
/ 04 февраля 2011

Я хочу изменить содержимое определенной ячейки в элементе управления dbgrid при загрузке базы данных.Например, допустим, я не хочу, чтобы какое-либо поле базы данных отображалось в dbgrid, если оно равно «запрещено» .Есть ли способ, которым я могу это сделать?

Ответы [ 6 ]

5 голосов
/ 05 февраля 2011

Переходя к исходному вопросу:

Используйте событие 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;
3 голосов
/ 05 февраля 2011

Использование событий DataSet для синхронизации пользовательского интерфейса не является хорошей практикой. Для этого вы можете полагаться на события источника данных, отделяя логику пользовательского интерфейса от бизнес-логики.

Поскольку состояние DataSet изменится с dsInactive на dsBrowse, вы можете положиться на изменение DataSource OnState, чтобы сделать что-либо связанное с пользовательским интерфейсом после загрузки данных из базы данных.

Вы можете положиться на поле 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;

Я публикую это, даже когда у вас есть принятый ответ, потому что О.Д. предложение - это то, чего вам следует избегать.

3 голосов
/ 04 февраля 2011

вы можете использовать DataSetNotifyEvent Afteropen

DBGrid.Datasource.Dataset.Afteropen: =

и вы можете скрыть поля с помощью:

, еслиУсловие затем DBGrid.columns [x] .visible: = false

В качестве альтернативы вы можете проверить условие для события OnDrawColumnCell, чтобы перезаписать / удалить некоторое содержимое в определенной ячейке

2 голосов
/ 06 февраля 2011

Я бы изменил запрос, который предоставляет данные в сетку, чтобы не включать строки (кортежи) с «запрещенной» строкой. Это кажется намного проще, чем пытаться не отображать данные после того, как они уже получены из базы данных.

2 голосов
/ 05 февраля 2011

Событие Hookup OnAfterOpen для набора данных.Получите скрытые поля и установите для его свойства Visible значение False, и ваша база данных не будет отображать их

Cheers

1 голос
/ 01 марта 2011

Я думаю, что лучшим способом было бы не ВЫБРАТЬ поля, ГДЕ SOME_VALUE = "запрещено" ИЗ DATABASE_TABLE

...