13. april 2004 - 16:51Der er
4 kommentarer og 1 løsning
Sortering med combobox
På en form har jeg en comboboks og er en DBGrid til at vise data fra en database. Felterne hedder f.eks. Dato og Nummer. Jeg vil gerne kunne sortere efter dato, når jeg vælger dato fra comboboksen på formen og det samme med Nummer
Du laver simpelthen et database-indeks til den tabel som du vil have skiftende sorteringer på. Dette kan vist laves "on-the-fly" men er lidt ineffektivt - det andet er smukkere. Jeg mener at det kan give noget "grimt" flimmer idet tabellen i realiteten lukkes, indeks skiftes og åbnes igen.
En alternativ løsning er at have data i et TListView (i report-mode) hvor brugeren kan ændre sorteringen ved at klikke på kolonnetitlerne. En TListView har et OnColumnClick og et OnCompare event som du kan bruge.
procedure TfrmMain.FormCreate(Sender: TObject); begin // Fetches data from a Access database ADONames.CommandText := 'select [ID], [Name] from [Names]'; ADONames.Active := true; lvNames.Items.BeginUpdate; try while not ADONames.Eof do begin with lvNames.Items.Add do begin Caption := IntToStr(ADONames['Id']); SubItems.Add(ADONames['Name']); end; // with ADONames.Next; end; // while finally ADONames.Active := false; lvNames.Items.EndUpdate; end; // try
fColumnClicked := 0; // Sort by ID fSortAscending := true; end;
procedure TfrmMain.lvNamesColumnClick(Sender: TObject; Column: TListColumn); begin if fColumnClicked = Column.Index then fSortAscending := not fSortAscending else begin fColumnClicked := Column.Index; fSortAscending := true; end; // else
// Delphi's got a CompareStr but no CompareInt or CompareFloat - bad! function CompareInt(const aInt1, aInt2 : integer) : integer; begin if aInt1 < aInt2 then result := -1 else if aInt1 > aInt2 then result := 1 else result := 0; end;
begin case fCOlumnClicked of 0 : Compare := CompareInt(StrToInt(Item1.Caption),StrToInt(Item2.Caption)); 1 : Compare := CompareStr(Item1.SubItems[fColumnClicked - 1],Item2.SubItems[fColumnClicked - 1]); end; // case
if not fSortAScending then // Reverse sort order. Compare := -Compare; end;
Hvis du stadig (og det vil du nok) vil skifte indeks, så skal du bruge nok bruge koden sådan her:
procedure TfrmMain.cbSortOrderChange(Sender: TObject); begin ADONames.IndexName := (Sender as TComboBox).Text; end;
... men det ser ikke ud til den Jet 4 Provider som jeg brugte til at tilgå tabellen (ADODataSet.ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\MKSSI\Delphi\Tests\ListView 01\Database.mdb;Persist Security Info=False' understøtter det - måske ODBC gør, men det er langsommere.
hrc>> Du har ikke lige nogen offenlig email, så skriver jeg til dig her.
Jeg synes det er fedt du er kommet med på Eksperten, der har i langtig ikke været nogle faste der skrev her inde fast ud over mig. For et par årsiden var her flere, dem du ser i top ti.
Jeg synes dine svar er gode og vel kvalificerede !
So keep up the good working !
Jens B
Jens B
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.