2010-08-03 19 views
3

J'utilise un TcxExtLookupComboBox de Devexpress et j'essaie d'implémenter une source de données personnalisée. J'ai mis le customdatasource comme ceci:Comment utiliser un TcxCustomDataSource dans un TcxExtLookupComboBox?

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    fDataSource := TMyDataSource.Create; 
    cbotestSearch.Properties.View.DataController.CustomDataSource := fDataSource; 
end; 

TMyDataSource est défini ici:

unit Datasource; 

interface 

uses 
    Classes, 
    IBQuery, 
    SysUtils, 
    cxCustomData; 

type 
    TSearchItem = class 
    private 
     BoldID: String; 
     Display: String 
    end; 

    TMyDataSource = class(TcxCustomDataSource) 
    private 
    fSearchList: TList; 
    protected 
    function GetRecordCount: Integer; override; 
    function GetValue(ARecordHandle: TcxDataRecordHandle; AItemHandle: TcxDataItemHandle): Variant; override; 
    public 
    constructor Create; 
    destructor Destroy; override; 
    procedure GetData; 
    end; 

implementation 

constructor TMyDataSource.Create; 
begin 
    inherited Create; 
    fSearchList := TList.Create; 
end; 

destructor TMyDataSource.Destroy; 
begin 
    FreeAndNil(fSearchList); 
    inherited; 
end; 

procedure TMyDataSource.GetData; 
var 
    vItem: TSearchItem; 
begin 
    fSearchList.Clear; 

    vItem := TSearchItem.Create; 
    vItem.BoldID := '1000'; 
    vItem.Display := 'test'; 
    fSearchList.Add(vItem); 

    vItem := TSearchItem.Create; 
    vItem.BoldID := '1100'; 
    vItem.Display := 'test2'; 
    fSearchList.Add(vItem); 

    DataChanged; // Don't do anything as provider is nil 
end; 

function TMyDataSource.GetRecordCount: Integer; 
begin 
    // Is never entered 
    Result := fSearchList.Count; 
end; 

function TMyDataSource.GetValue(ARecordHandle: TcxDataRecordHandle; 
    AItemHandle: TcxDataItemHandle): Variant; 
begin 
    // Is never entered 
    Result := 'Test'; 
end; 

end. 

Le problème est que TMyDataSource.GetValue est jamais appelé. Tout indice comment réparer?

Mise à jour 1: J'ai un autre indice ici. Si je seule étape dans la méthode DataChanged qui devrait provoquer GetValue être appelé est ressemble à ceci:

procedure TcxCustomDataSource.DataChanged; 
begin 
    if Provider = nil then Exit; 

    // Code using Provider 
end; 

et fournisseur est nul dans ce cas. Mais j'ai assigné la Datasource dans Forms surcreate comme vous le voyez.

+0

Non que cela se produit automatiquement lors de l'appel cadre DevExpress DataChanged –

Répondre

1

cxExtLookupComboBox ne peut fonctionner qu'avec les vues DB ~. Ces vues ne peuvent pas accepter les instances de l'objet TcxCustomDataSource en tant que DataSource. Donc, votre code ne fonctionnera pas :-(Il est suggéré de mettre en œuvre cette fonctionnalité dans l'avenir et il est inscrit à:..

http://www.devexpress.com/Support/Center/ViewIssue.aspx?issueid=AS10025

+0

Oui, j'ai remarqué ça aussi maintenant. –