![]() |
DBGrid sortieren nach Spalte und Ab- oder Aufwärts
Hi,
hiermit kann man ein Grid egal auf welche Spalte man klickt entweder Auf- oder Abwärts sortieren. Die Variable vor der Prozedurendeklaration, soll nur bedeuten das die Var in einer Klasse, oder Global oder ins Privat z.B. sein sollte, es geht auch da wo sie jetzt ist, sie darf nur nicht in der Prozedur sein, sonst ist es 1. nicht initialisiert und 2. könnte man sich sonst nie den letzten Wert speichern. In der Zeile(ADODataSet1.CommandText := 'SELECT * FROM Table ORDER BY ' + sSortColumn;) ist das ASC nicht nötig das dies schon der Standardwert von Order ist.
Delphi-Quellcode:
var
bSortOrder: Boolean; procedure TForm1.DBGrid1TitleClick(Column: TColumn); var sSortColumn: String; begin sSortColumn := DBGrid1.Columns.Items[Column.Index].FieldName; ADODataSet1.Close; if bSortOrder then begin ADODataSet1.CommandText := 'SELECT * FROM Table ORDER BY ' + sSortColumn; end else begin ADODataSet1.CommandText := 'SELECT * FROM Table ORDER BY ' + sSortColumn + ' DESC'; end; ADODataSet1.Open; bSortOrder := not bSortOrder; end; |
Re: DBGrid sortieren nach Spalte und Ab- oder Aufwärts
Hai,
ich habe da noch eine Idee. Die Sortierreihenfolge wird nur geändert wenn mann nocheinmal auf die selbe Titelspalte klickt. Ansonsten wird bei selber reihenfolge nur das Sortierfeld geändert. bSortOrder und sSortColumn sollten natürlich im OnCreate initialisiert werden.
Delphi-Quellcode:
[edit=Matze]Code formatiert. Mfg, Matze[/edit]
var
bSortOrder: Boolean; sSortColumn: string; procedure TForm1.DBGrid1TitleClick(Column: TColumn); begin if Column.FieldName <> sSortColumn then begin sSortColumn := Column.FieldName; end else begin bSortOrder := not bSortOrder; end; ADODataSet1.Close; if bSortOrder then begin ADODataSet1.CommandText := 'SELECT * FROM Table ORDER BY ' + sSortColumn; end else begin ADODataSet1.CommandText := 'SELECT * FROM Table ORDER BY ' + sSortColumn + ' DESC'; end; ADODataSet1.Open; end; |
Re: DBGrid sortieren nach Spalte und Ab- oder Aufwärts
Unser Forenuser Union hat dazu noch eine kleine Erweiterung geschrieben, um mehrere Spalten gemischt zu sortieren.
Zitat:
Delphi-Quellcode:
[edit=Matze]Code formatiert. Mfg, Matze[/edit]
procedure ApplySortToQuery(AQuery: TQuery; ASortArray: array of string);
var I: Integer; ASortString, AFilter: string; begin ASortString := ''; for I := 0 to High(ASortArray) do ASortString := ASortString + ASortArray[I]; // Achtung, die letzten zwei Zeichen werden gelöscht! System.Delete(ASortString, Length(ASortString)-1, 2); AFilter := AQuery.Filter; try AQuery.DisableControls; AQuery.Close; AQuery.Filter := ''; if pos('order by', AQuery.SQL.Strings[AQuery.SQL.Count-1]) > 0 then AQuery.SQL.Delete(AQuery.SQL.Count-1); if ASortString <> '' then ASortString := 'order by ' + ASortString; AQuery.SQL.Add(ASortString); finally AQuery.Open; AQuery.Filter := AFilter; AQuery.EnableControls; end; end; |
Re: DBGrid sortieren nach Spalte und Ab- oder Aufwärts
Peinhard hat noch folgenden Vorschlag:
Wenn man mit ADO und client-seitigem Cursor (clUseClient) arbeitet, kann man auch auf das erneute Holen der Datenmenge (neuer SELECT mit geändertem ORDER BY) verzichten. Die property 'Sort' der ADO-Objekte 'hört' auf die gleiche Syntax wie sie auch nach ORDER BY verwendet wird, es ist also sehr einfach die Codebeispiele entsprechend anzupassen. Beispiel: statt einen neuen
SQL-Code:
abzusetzen, folgenden Code ausführen:
SELECT * FROM Tabelle ORDER BY Datum DESC, Bezeichnung ASC
Delphi-Quellcode:
Auch bei der Sort-Syntax gilt wie bei ORDER BY, daß ASC bei Feldern ohne explizite Angabe Voreinstellung ist, also weggelassen werden kann.
ADODataset.Sort := 'Datum DESC, Bezeichnung ASC';
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:46 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-2025 by Thomas Breitkreuz