![]() |
Stringgrid mit filter
Hallo Zusammen,
ich würde gerne in einem Stringgrid Zeilen ausblenden, die nicht in die Filterbedingung passen also in einem Großem Stringgrid nur bestimmte Zeilen anzeigen. Jedoch wenn ich das Stringgrid speicher sollen alle Einträge wieder gespeichert werden, und nicht nur die die angezeigt werden. Gibt es da einen Einfachen weg oder brauch ich ein 2. Stringgrid das ich dann mit dem Ersten Synchronisieren wenn Änderungen vorgenommen wurden ? Schönen Gruß 5etH |
Re: Stringgrid mit filter
Hallo,
die Daten an anderer Stelle vorhalten(z.B. Array) und nur die gefilterten Daten im Grid anzeigen. Speichern der Daten dann aus der Datenhaltung. |
Re: Stringgrid mit filter
ich habe nun folgendes im internet gefunden ^^
Delphi-Quellcode:
leider ist es so, dass er die änderungen die ich in der Filteransicht treffe nicht übernimmt, da er nur die alten einträge wieder in das Stringgrid schreibt.
procedure SetFilter(ACol:Integer;Exp:string);
var I,Counter:Integer; begin FilterList:=TStringList.Create; with form1.stringGrid2 do begin //Filterliste mit Gridinhalt füllen for I := FixedRows to RowCount - 1 do FilterList.Add(Rows[I].Text); //Grid filtern Counter:=FixedRows; for I := FixedRows to RowCount - 1 do begin if Cells[ACol,I] <> Exp then begin Rows[I].Clear; end else begin if Counter <> I then begin Rows[Counter].Assign(Rows[I]); Rows[I].Clear; end; Inc(Counter); end; end; RowCount:=Counter; end; end; procedure RestoreFilter; var I:Integer; begin with form1.Stringgrid2 do begin RowCount:=FixedRows+FilterList.Count; for I:=0 to FilterList.Count - 1 do Rows[FixedRows+I].Text := FilterList.Strings[I]; end; FilterList.Free; end; ich weis aber leider jetzt nicht so recht wie ich das Problem am besten angehe, das er die änderungen übernimmt gruß 5etH |
Re: Stringgrid mit filter
Also den Ansatz, gefilterte Zeilen zu puffern und danach zurück zu schreiben, finde ich unglücklich gelöst.
Den Ansatz von Lannes, die Daten in einem 2-dimensionalen Array halten und im Grid nur die sichtbaren (und gefilterten) Daten anzeigen, wäre der wesenlich effizientere Weg. |
Re: Stringgrid mit filter
Hallo,
oder anders gefragt, woher kommen deine Daten denn ? Ich benutze z.B. Listen (TList). Das RowCount des Grids ergibt sich dann nicht als List.Count, sondern es wird anhand des Filters berechnet. Ich gehe also vor dem Eintragen meine Liste durch und prüfe die Filter-Bedingung. Die gleiche Filterfunktion wird dann beim Eintragen benutzt, um "nicht-Filter"-Zeilen /Listeneinträge zu überspringen. Heiko |
Re: Stringgrid mit filter
okay habe es geschaft für den, den es interessiert hier meine lösung:
Delphi-Quellcode:
vielen Dank nochmal
procedure SetFilter(ACol:Integer;Exp:string);
var I,Counter:Integer; begin FilterList:=TStringList.Create; with form1.stringGrid1 do begin //Filterliste mit Gridinhalt füllen for I := FixedRows to RowCount - 1 do FilterList.Add(Rows[I].Text); //Grid filtern Counter:=FixedRows; for I := FixedRows to RowCount - 1 do begin if Cells[ACol,I] <> Exp then begin Rows[I].Clear; end else begin if Counter <> I then begin Rows[Counter].Assign(Rows[I]); Rows[I].Clear; end; Inc(Counter); end; end; RowCount:=Counter; end; end; procedure RestoreFilter; var I:Integer; begin with form1.Stringgrid1 do begin RowCount:=FixedRows+FilterList.Count; for I:=0 to FilterList.Count - 1 do Rows[FixedRows+I].Text := FilterList.Strings[I]; end; FilterList.Free; end; procedure TForm1.Button3Click(Sender: TObject); //Filtern var I: Integer; vorhanden : Boolean; begin vorhanden := false; button3.Enabled := false; edit2.Enabled := false; combobox2.Enabled := false; button7.Enabled := true; for I := 1 to stringgrid1.RowCount - 1 do begin if stringgrid1.Cells[combobox2.ItemIndex+1,i] = edit2.text then begin vorhanden := true; end; end; if vorhanden then begin SetFilter(combobox2.ItemIndex+1,edit2.text); end else begin showmessage('No records with '+edit2.Text+' where found!'); button3.Enabled := true; edit2.Enabled := true; combobox2.Enabled := true; button7.Enabled := false; end; end; procedure TForm1.Button7Click(Sender: TObject); //Restore var Dynarray : array of array of String; I : Integer; X: Integer; Y: Integer; begin button3.Enabled := true; edit2.Enabled := true; combobox2.Enabled := true; button7.Enabled := false; setlength(dynarray,5); for I := 0 to 5 - 1 do begin setlength(dynarray[i],stringgrid1.rowCount); end; for X := 0 to Stringgrid1.ColCount -1do begin for Y := 0 to stringgrid1.rowCount -1 do begin dynarray[x,y] := stringgrid1.Cells[x,y]; end; end; RestoreFilter; for X := 0 to Stringgrid1.rowCount - 1 do begin for Y := 0 to length(dynarray[0]) -1 do begin if stringgrid1.Cells[0,X] = dynarray[0,Y] then begin for I := 0 to 5 - 1 do begin stringgrid1.Cells[I,X] := dynarray[I,y]; end; end; end; end; end; schöne Grße 5etH |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz