Обновить цвета в cxGrid

У меня есть cxGrid, где я меняю цвет фона некоторых полей на основе значений в некоторых полях. Это все работает очень хорошо. Но если я что-то изменяю в данных сетки, цвета не обновляются, пока я не закрою заново свою форму.

Какую процедуру вызвать, чтобы получить это обновление, если запись меняется?

2 ответа

По моему опыту, он обновляется, когда вы переключаете строку. Но я использовал его в режиме DB с TClientDataSet.

Проверьте методы, такие как

  • TcxControl.InvalidateRect
  • TcxControl.InvalidateRgn
  • TcxControl.InvalidateWithChildren

Вы также можете сделать недействительным узел:

  • TcxGrid.ActiveView.Invalidate;
  • TcxGrid.ViewData.Records [0].Invalidate;
  • TcxGridViewData.Rows [0].Invalidate
  • TcxCustomGridTableController.FocusedRecord.Invalidate;

События как

  • TcxCustomGridTableViewStyles.OnGetContentStyle
  • TcxCustomGridTableItem.OnCustomDrawCell

также выставляет эти элементы (с их методами Invalidate) среди или внутри параметров, таких как

  • ARecord: TcxCustomGridRecord;
  • ViewInfo -> TcxGridTableCellViewInfo.GridRecord

Другими словами - откройте модуль cxTL и grep для "аннулирования" слова и запишите каждое совпадение.

Если ваша сетка присоединена к набору данных, а данные в наборе данных изменяются, события OnGetContentStyle вызываются автоматически. Убедитесь, что ваш набор данных знает, что данные обновлены. Похоже, что ваша форма редактирования не говорит, что набор данных сетки обновляется сам. Вы можете сделать это либо с помощью процедуры обратного вызова, либо с помощью шаблона Observer.

Следующий код демонстрирует, как реализовать событие OnGetContentStyle для столбца сетки.

procedure TFormWithGrid.cxGrid1DBTableView1LASTNAMEStylesGetContentStyle(
  Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
  AItem: TcxCustomGridTableItem; var AStyle: TcxStyle);
begin
  if ARecord.Values[cxGrid1DBTableView1FIRSTNAME.Index] = 'test' then
  begin
    AStyle := TcxStyle.Create(nil);
    AStyle.Color := clRed;
    AStyle.Font.Style := [fsBold];
  end;
end;

В моей ситуации это будет работать cxGridDBTblVwContenido.DataController.Refresh;

Другие вопросы по тегам