tcxGrid с использованием TList в качестве источника данных - PullRequest
3 голосов
/ 01 ноября 2011

Мне интересно, возможно ли связать объект TList как источник данных cxGrid.

Итак, у меня есть объект TList, содержащий различные объекты, которые мне не нужно сохранять.Я хочу, чтобы своего рода GridView служил обзором «выбранных элементов», а выбранные элементы были объектами в списке.

Было бы предпочтительно, чтобы столбцы определялись типом сохраняемого объектав TList.

Это легко выполнимо, и если да, то сможете ли вы дать мне обзор того, как это делается.В настоящее время я использую ListBox, который использует tabWidth как своего рода разделитель столбцов, но предпочел бы сделать переключение.

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

В Quantum Grid есть три разных способа доступа к данным. Он может работать без привязки (доступ к ячейкам напрямую), с привязкой (стандартный способ использования источника данных) или в режиме «провайдера», где вам нужно написать соответствующий класс (провайдера) для доступа и изменения данных. В режиме провайдера источник данных может быть любым. В справке подробно рассказывается, как реализовать провайдера. Также среди демонстрационных приложений должен быть UnboundListDemo.

1 голос
/ 15 января 2012

Предположим, что у вас есть производный от TList класс TMyList, который содержит элементы класса TMyListItem. Затем вы получите производную от TcxCustomDataSource.

  TTListDataSource = class(TcxCustomDataSource)
       private
          FTList  : TMyList;
       protected
          function GetRecordCount: Integer; override;
          function GetValue(ARecordHandle: TcxDataRecordHandle; AItemHandle: TcxDataItemHandle): Variant; override;
       public
          constructor Create(ATList : TMyList);
   end;

Реализация будет выглядеть так:

constructor TTListDataSource.Create(ATList : TMyList);
begin
   inherited Create;
   FTList := ATList;
end;

function TTListDataSource.GetRecordCount: Integer;
begin
   result := FTList.Count;
end;

function TTListDataSource.GetValue(ARecordHandle: TcxDataRecordHandle;
                                   AItemHandle: TcxDataItemHandle): Variant;
var
   aIndex         : Integer;
   aMyListItem    : TMyListItem;
begin
   aCurrentIndex  := Integer(ARecordHandle);
   if (aCurrentIndex > -1)  and (aCurrentIndex < FTList.Count) then begin
      aMyListItem    := FTList[aCurrentIndex)] as TMyListItem;
      aIndex         := Integer(AItemHandle);
      case aIndex of
         0                  : result := '';
         1                  : result := aMyListItem.Year;
         2                  : result := aMyListItem.Quarter;
      end
      else
         result := '';
end;

И вы бы использовали свой класс:

   FTListDataSource := TTListDataSource.Create(ATList);
   ThePivotGrid.DataController.CustomDataSource := FTListDataSource;
   FTListDataSource.DataChanged;
...