Блог


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


Теги

Информация

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

Фильтр по тегу: группировка


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 просмотры: 3688, комментарии: 2



Как разделить группы толстыми линиями в cxGrid?

Как разделить группы похожих записей в TcxGrid толстыми линиями?


procedure TForm1.cxGrid1DBTableView1CustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var R: TRect;
begin
  if AViewInfo.GridRecord.Index = Sender.DataController.RecordCount-1 then Exit;
  if Sender.DataController.Values[AViewInfo.GridRecord.Index, 1] = Sender.DataController.Values[AViewInfo.GridRecord.Index+1, 1] then Exit;
  R := AViewInfo.ContentBounds;
  Sender.LookAndFeelPainter.DrawHeader(ACanvas, R, R, [], [], cxbsNormal,
    AViewInfo.Item.GetProperties.Alignment.Horz,  vaCenter, False, False,
    AViewInfo.Text, ACanvas.Font, ACanvas.Font.Color, ACanvas.Brush.Color);
  ACanvas.FillRect(Rect(R.Left,R.Bottom-2,R.Right,R.Bottom),clBlack);
  ADone := true;
end;




Картинка с другого сайта.
Взято из этого сообщения SQL.RU:
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=985177&msg=13510748
добавлено: 22 ноя 12 просмотры: 2042, комментарии: 0



ListView с группированием

Как в ListView добавить кнопки с + и -, чтобы можно было сворачивать и разворачивать строки и группы

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

Всё здесь
Grouping Items in a TListView
добавлено: 30 июл 12 просмотры: 2591, комментарии: 0



Пройтись в цикле по выделенным записям с учетом группировки в cxGrid

Даже если TcxGridDBTableView сгруппирован, то процедура будет пропускать строки групп и будет обрабатывать только выделенные записи

procedure ProcessSelectedRecords(grid: TcxGridDBTableView; ColumnIndex: integer);
Var
 i: integer;
 ARowIndex: Integer;
 ARowInfo:  TcxRowInfo;
begin
  with grid.dataController do
  begin
        beginupdate;
        Screen.Cursor := crHourGlass;
        try
          for I := 0 to GetSelectedCount - 1 do
            begin
              ARowIndex := GetSelectedRowIndex(I);
              ARowInfo  := GetRowInfo(ARowIndex);
              if ARowInfo.Level < Groups.GroupingItemCount then
                Continue
              else
                begin
                  ShowMessage(VarToStr(Values[ARowInfo.RecordIndex, ColumnIndex]));
                  ShowMessage(VarToStr(Values[ARowInfo.RecordIndex,  grid.GetColumnByFieldName('имя_нужной_колонки').Index]));
                end;//else
            end;//for
        finally
          endupdate;
          Screen.Cursor := crDefault;
        end;//try
  end;//with
end;


Ещё можно использовать ForEachRow(), см. справку

И здесь ещё есть информация: Как получить значения записей выделенных строк в cxGrid
добавлено: 16 июл 12 просмотры: 2985, комментарии: 0



cxGrid группировка с сортировкой по другому столбцу

Для нормальной работы сортировки надо писать так:

procedure TForm2.cxGrid1DBBandedTableView1DataControllerCompare(
  ADataController: TcxCustomDataController; ARecordIndex1, ARecordIndex2,
  AItemIndex: Integer; const V1, V2: Variant; var Compare: Integer);
begin
if ADataController.Values[ARecordIndex1, {Индекс столбца}] < ADataController.Values[ARecordIndex2, {Индекс столбца}] then
   Compare := -1
else
   if ADataController.Values[ARecordIndex1, {Индекс столбца}] = ADataController.Values[ARecordIndex2 {Индекс столбца}] then
     Compare := 0
   else
     Compare := 1;
end;



Для сортировки по столбцу №2 код будет выглядеть следующим образом:
procedure TForm2.cxGrid1DBBandedTableView1DataControllerCompare(
  ADataController: TcxCustomDataController; ARecordIndex1, ARecordIndex2,
  AItemIndex: Integer; const V1, V2: Variant; var Compare: Integer);
begin
if ADataController.Values[ARecordIndex1, 2] < ADataController.Values[ARecordIndex2, 2] then
   Compare := -1
else
   if ADataController.Values[ARecordIndex1, 2] = ADataController.Values[ARecordIndex2, 2] then
     Compare := 0
   else
     Compare := 1;
end;



Отсюда: https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=712712&msg=12748829
добавлено: 12 июл 12 просмотры: 2589, комментарии: 0