2009-05-20 6 views
4

Ich verwende ein DevExpress TdxMemData im Speicher TDataSet Nachkomme. Es hat zwar Filtered: Boolean und Filter: String-Eigenschaften, es scheint jedoch nicht automatisch irgendetwas damit zu tun, sondern verlässt sich auf das Ergebnis des Accept-Parameters des OnFilterRecord-Ereignisses.Überprüfen Sie in TDataSet Zeile gegen eine Filterzeichenfolge

Also nach was ich suche ist ein Weg (vielleicht ist es in TdxMemData oder woanders in DevExpress's Code-Reihe), den Filtertext zu analysieren und ihn auf das Dataset anzuwenden.

Idealerweise möchte ich eine Möglichkeit, eine einzelne Zeile mit dem Filter zu testen, um zu sehen, ob es übereinstimmt, ohne es aus dem Dataset zu filtern (ich möchte Zeilen hervorheben, die dem Filter entsprechen).

Beispiel Filter string:

((Name = 'Jim') and (Rep > 1000)) or (Rep > 5000) 

So ist verschachtelt und die und oder der. Es wird tatsächlich von DevExpress TcxDBFilterControl erstellt.

Ich hoffe wirklich, es gibt etwas Einfaches, das ich vermisse.

Update: Ich öffnete eine ticket with DevExpress, um zu sehen, ob sie irgendeine Art von Lösung unterstützen. Ich habe ihre Lagerantwort gefunden, die they don't support filtering auf TdxMemData.

Antwort

4

Ich weiß, dass dies nicht die Antwort ist, nach der Sie suchen, aber das TdxMemData-Dataset unterstützt keine Filterzeichenfolgen. Um Filter zu verwenden, codieren Sie entweder Ihr eigenes OnFilterRecord-Ereignis oder setzen Sie ProgramedFilter auf true und füllen Sie die FilterList mit einer Liste der Datensätze, die (zur Laufzeit) gefiltert werden.

Eine Möglichkeit wäre, einen eigenen Parser zu programmieren, um die Filterzeichenfolge mit dem aktuellen Datensatz im OnFilterRecord-Ereignis zu vergleichen.

+0

Das ist, was ich getan habe! –

2

Möglicherweise möchten Sie die TdxMemData durch TkbmMemTable ersetzen. Es ist kostenlos, funktioniert ähnlich wie die DX-Komponente und unterstützt Filter-Strings. Würde wahrscheinlich viel weniger Zeit für die Portierung benötigen, als einen Filterstring-Parser in OnFilterRecord zu implementieren! Es funktioniert problemlos mit den anderen DX-Komponenten.

+0

Ja, Ich habe es gerade jetzt heruntergeladen. Ich sah, dass es Filterzeichenfolgen unterstützt. Scheint ein großer Fehler zu sein, dass DevExpress das nicht unterstützt. –

+0

@Jim: Aber Sie suchen nicht, die Daten zu filtern, damit nicht Von Ihrer ursprünglichen Frage: "Ohne es aus dem Dataset herauszufiltern (Ich möchte Zeilen hervorheben, die dem Filter entsprechen).", möchten Sie anders anzeigen. TkbMemTable ist ein Container; es wird nichts helfen Sie zeigen es anders an –

1

Was Sie suchen, ist nicht die Daten filtern, sondern eine Frage der Anzeige anders, wenn es eine Bedingung erfüllt. Wenn Sie eine TDBGrid verwenden die Daten anzuzeigen, schauen Sie in die DrawColumnCell() Ereignis auf dem TDBGrid:

procedure TForm1.dbgrd1DrawColumnCell(Sender: TObject; const Rect: TRect; 
    DataCol: Integer; Column: TColumn; State: TGridDrawState); 
var 
    DBG: TDBGrid; 
begin 
    DBG := TDBGrid(Sender); 
    // Add any other conditions from your 'filter' here in the next line. 
    if (YourData.FieldByName('WHATEVER').AsString = 'Jim') and 
    (YourData.FieldByName('REP').AsInteger > 1000) then 
    Column.Font.Color := clRed; 
    DBG.DefaultDrawColumnCell(Rect, DataCol, Column, State); 
end; 

Da Sie verwenden TdxMemData, sind Sie wahrscheinlich das Devex Rasters, auch. Es muss einen ähnlichen Weg haben, etwas anderes als die Standardzeichnung zu tun; Sie können dort eine ähnliche Technik verwenden. (Ich habe das DevEx-Zeug in ein paar Jahren nicht verwendet; derzeitiger Arbeitgeber mag sie nicht und wird daher nicht für die Kosten aufspringen. :-()

+0

Das würde funktionieren, aber ich möchte in der Lage sein, die Kriterien von der dynamischen Filterzeichenfolge zu bekommen, die durch eine andere Quelle erzeugt wird. –

+0

Wie geht es dir? die Kriterien von der externen Quelle anpassen?Sie könnten es beispielsweise selbst in Name/Wert-Paaren in einer TStringList analysieren und dann diese Vergleiche im DrawColumnCell() - Ereignis verwenden. Kein Filteraspekt irgendeines Produktes wird helfen, weil Sie nicht auf * Filter * überhaupt schauen. Sie möchten basierend auf einem Kriterium eine andere Darstellung vornehmen. Wenn Sie Informationen darüber geben, wie Sie die Kriterien erhalten, können Sie Ihre Frage besser beantworten. –

+0

@Ken, Ihr Codebeispiel wird alle Zeilen gleich färben, da es die Farbgebung basierend auf dem aktuellen Datensatz im Datensatz und nicht demjenigen, der gerade gefärbt wird, auswertet. –