Блог


Последние записи


Теги

Информация

Delphi, DevExpress, примеры, решения

Фильтр по тегу: checkbox


TcxGrid - summary по условию, как подсчитать количество отмеченных CheckBox`ов

TcxGridDBTableView сгруппирован по двум полям.
Есть поле типа CheckBox, нужно посчитать количество включенных чекбоксов в каждой группе, в group summary.

1. В сетке открываем Summary/Groups.
2. Добавляем groups 1 шт.
3. Добавляем Items - здесь столько записей, сколько нужно отображать итогов, у меня по трём полям. Третье поле должно подсчитываться по условию.
4. В Linked columns выбираем те поля, по которым сгруппирована сетка, у меня по двум полям.
5. В Items выбираем нужную запись, у меня это та самая колонка типа CheckBox.
6. В инспекторе свойств указываем правильные значений свойств.
7. В свойстве Column выбираем колонку типа checkbox, в ней, в итогах (summary) будем отображать количество отмеченных переключателей.
8. В свойстве Kind указываем vkSum.
9. В свойстве Format указываем !9;0;0, иначе вместо положительных цифр будем иметь значение типа "-12,000", а должно быть просто "12".


Картинка с другого сайта.


Обсуждение здесь: https://www.sql.ru/forum/1041774-1/cxgrid-summary-po-usloviu


В итоге результат вот такой:

Картинка с другого сайта.
добавлено: 18 авг 13 просмотры: 4402, комментарии: 2



Несвязанные чекбоксы в cxGrid (unbound column)

Иногда возникают случаи, когда необходимо выбрать некоторые записи с помощью CheckBox`ов и работать только с отмеченными записями. “Выбрано/Не выбрано” в базе хранить неразумно, тем более, если приложение многопользовательское. Для работы с информацией об отмеченных записях правильнее создать unbound столбец с Properties=CheckBox и отдельно список для хранения состояний (статусов) комбобоксов в этом столбце.

В классе формы определяем:
private
  AList: TList;
  function CheckList(ARecord: TcxCustomGridRecord): Boolean;

  function TForm1.CheckList(ARecord: TcxCustomGridRecord): Boolean;
  begin
    Result := AList.IndexOf(Pointer(ARecord.RecordIndex)) <> - 1;
  end;


При создании формы - создаем список, при закрытии - освобождаем память:
procedure TForm1.FormCreate(Sender: TObject);
begin
  AList := TList.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  AList.Free;
end;



При клике мышкой на ячейке с чекбоксом выполняется следующее:
procedure TForm1.cxGrid1DBTableView1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 var
  AHitTest: TcxCustomGridHitTest;
  AGridRecord: TcxCustomGridRecord;
begin
  if Sender is TcxGridSite then
  begin
    with TcxGridSite(Sender).GridView do
      AHitTest := ViewInfo.GetHitTest(X, Y);

    if (AHitTest.HitTestCode = htCell) and  (TcxGridDBColumn(TcxGridRecordCellHitTest(AHitTest).Item).DataBinding.FieldName = '') then
      AGridRecord := TcxGridRecordCellHitTest(AHitTest).GridRecord
    else
      Exit;
  end;

  if (AGridRecord <> nil) then
    if CheckList(AGridRecord) then
      AList.Remove(Pointer(AGridRecord.RecordIndex))
    else
      AList.Add(Pointer(AGridRecord.RecordIndex));
end;



Отрисовка чекбокса в зависимости от его статуса, хранящегося в AList:
procedure TForm1.cxGrid1DBTableView1DBColumn1CustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
  if AViewInfo.EditViewInfo is TcxCustomCheckBoxViewInfo then
    TcxCustomCheckBoxViewInfo(AViewInfo.EditViewInfo).State :=  TcxCheckBoxState(CheckList(AViewInfo.GridRecord));
end;



Отмеченные записи можно выделить цветом:
procedure TForm1.cxGrid1DBTableView1CustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
  with AViewInfo do
    if CheckList(GridRecord) then
      ACanvas.Brush.Color := clHighlight
    else
      ACanvas.Brush.Color := clWindow;

  ACanvas.Font.Color := clBlack;
end;
добавлено: 13 июл 12 просмотры: 4701, комментарии: 2