Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBgrid-Sortierung (https://www.delphipraxis.net/4401-dbgrid-sortierung.html)

Hansa 27. Apr 2003 15:27


DBgrid-Sortierung
 
Hi,

wenn ich in einem Grid die Titelzeile anklicke, kann doch die Sortierreihenfolge geändert werden. Ich finde aber nur OnCellClick usw. wo muß das eingebaut werden?

woki 27. Apr 2003 16:49

Hallo,

das Ereignis auf das Du in einem DBGrid reagieren mußt, heißt onTitleClick.

Für die Sortierung mußt Du aber die Fähigkeiten des verbundenen Datasets verwenden, das DBGrid zeigt wirklich nur Daten an.

Tschüss
Wolfgang

Hansa 27. Apr 2003 17:03

Das kommt davon, wenn man die Events nicht bis zum bitteren Ende durchcheckt. Es ist das vorletzte. 8) Das order-by muß natürlich angepaßt werden. Das ist klar. Wo gibts ein gutes Beispiel ? Das könnte alles sehr komplex werden. Ich will so vorgehen, daß beim klicken auf die Titelzeile nach der entsprechenden Spalte sortiert wird. Wi komme ich nun an die Spalte ? Die Zeile alleine nützt mir doch nichts, oder ?

DelphiDeveloper 27. Apr 2003 17:06

Sortierung im Grid
 
Mit dem OnTitleClick habe ich auch früher gearbeitet.
Seit ich aber IBObjects kenne geht das kinderleicht.

IBObjects sind für mich die besten nativen Interbase/Firebird Komponenten. Lohnt sich wirklich.

Für nicht kommerzielle Zwecke gibt es auch eine kostenlose Vollversion
www.ibobjects.com

Im übrigen ist der Entwickler von ibobjects auf der diesjährigen europäischen firebird Konferenz im Mai in Fulda.
Schaut doch mal bei http://www.firebird-conference.com vorbei.

Kommen einige Leute aus dem Forum hier zur firebird Konferenz?

woki 27. Apr 2003 17:28

Hi,

es die die zugehörige Column-Komponente als Parameter übergeben, und dann geht es so weiter:

Column.Field.DataSet etc..


Tschüss
Wolfgang

Hansa 27. Apr 2003 17:37

wie, wo was ? wo ist da ein Parameter?

[edit=Daniel B]Doppelpost gelöscht. MfG Daniel B.[/edit]

woki 27. Apr 2003 17:44

Hi,

der Rumpf der von Delphi erzeugten Ereignisbehandlungsroutine

Code:
procedure TForm5.DBGrid1TitleClick([size=18]Column: TColumn[/size]);
begin
  Column.Field.DataSet
end;

Sharky 27. Apr 2003 17:45

Zitat:

Zitat von Hansa
wie, wo was ? wo ist da ein Parameter?

Ei da:

Delphi-Quellcode:
procedure TFRM_Main.DBGrid1TitleClick(Column: TColumn);
 begin
  Query1.Close;
  Query1.SQL.Text := 'SELECT * FROM tabelle ORDER BY '
   + Column.FieldName;
  Query1.Open;
 end;
Das ist natürlich die minni lösung. Aber als Lösungsansatz sollte es reichen.

Hansa 27. Apr 2003 17:54

Die Mini-Lösung reicht doch fast schon aus. Und den Parameter Column habe ich leider übersehen. :shock:

@Sharky: Hast zufällig Du mir mal das mit dem Page-Control und den Frames erklärt? Finde den Beitrag nicht mehr.

Sharky 27. Apr 2003 17:58

Zitat:

Zitat von Hansa
Die Mini-Lösung reicht doch fast schon aus. Und den Parameter Column habe ich leider übersehen.

Mini ist es weil:
  • Die Sortierrichtung nicht geändert werden kann.
    Nicht angezeigt wird nach welcher Spalte Sortiert wird (Pfeil auf / ab)

Aber das ist leich einzufügen.

Hansa 27. Apr 2003 18:31

Bei mir wird zumindest nach angeklickter Spalte sortiert. Da fällt mir aber noch mehr auf:

1. Bei meiner fetten Tabelle sind zu viele Spalten drin, wegen des "Select * from", aber ich will den Anwender entscheiden lassen, was er sieht, also muß er an alles rankommen. Wie kann ich jetzt zulassen, daß einzelne Spalten ausgeblendet werden? Oder umgekehrt, ich biete ihm die Spalten an, die er sowieso braucht und er kann welche hinzufügen ? Wahrscheinlich brauche ich beide Varianten. Grob schwebt mir da eine Auswahlbox vor mit markieren, alle markieren usw. Aber irgendwie gefällt mir das nicht. Wie macht ihr sowas ?

2. Im Moment habe ich nur einen Primary Key, was ist mit Indices, Foreign Keys usw.? Sollte man das auch schon mal einbauen, oder erst, falls die Performance in die Knie gehen sollte (was im Moment nicht zu bemerken ist) ?

Hansa 27. Apr 2003 19:45

Noch eine kurze Frage: Wie kann ich denn in der Titelleiste die Spalte, nach der sortiert wird irgendwie hervorheben :?:

Sharky 28. Apr 2003 07:26

Zitat:

Zitat von Hansa
Noch eine kurze Frage: Wie kann ich denn in der Titelleiste die Spalte, nach der sortiert wird irgendwie hervorheben :?:

Hai Hansa,

ich verwende immer die DB-Grids von den RX-Tools, dort gibt es recht einfach die Möglichkeit eine Markierung in der Titelleiste anzuzeigen.

Zu deiner anderen Frage:
In einem Grid würde ich immer nur die absolut notwendigen Spalten anzeigen. Wenn der Anwender details wissen möchte öffne ich bei einem Doppelklick ein neues Fenster in dem ich dann alle anderen Daten anzeige.

Hansa 29. Apr 2003 12:15

Ich habe jetzt folgendes Problem: Es sind einfach zu viele Spalten vorhanden. Wie Sharky, will ich lieber automatisch die notwendigen Spalten automatisch im Grid drin haben und dann eine Auswahlbox bringen, wo die anderen Felder hinzugefügt werden können. Nun habe ich mir mal die Lieferanten vorgeknöpft :

Code:
procedure TForm2.DBGrid1TitleClick(Column: TColumn);
begin
  with LiefModul.LiefDS do begin
    Close;
    SelectSQL.Text := 'SELECT * FROM LIEF8 WHERE NR >= ' +
    LabeledEdit1.Text + ' AND NR <=' + LabeledEdit2.Text+' ORDER BY ' + Column.FieldName;
    if RadioGroup1.ItemIndex = 1 then
      SelectSQL.Text := SelectSQL.Text + ' DESC';
    Open;
  end;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  with LiefModul do begin
    DBGrid1.Hide;
    LiefDS.Close;
    LiefDS.SelectSQL.Text := 'SELECT NR, NAME FROM LIEF8 WHERE NR >= ' +
    LabeledEdit1.Text + ' AND NR <=' + LabeledEdit2.Text+' ORDER BY NR';
    LiefDS.Open;
    DBGrid1.Show;
  end;
end;
Für Testzwecke setze ich die Select Anweisung per ButtonClick auf Anzeige nur der Nr und des Namens. Soweit geht das auch so, ABER die Titelzeile des Grids enthält immer noch alle Felder und ist genauso breit wie vorher. Das Grid weiß Sachen, die es nicht wissen soll/kann. :shock:

Sharky 29. Apr 2003 13:04

Zitat:

Zitat von Hansa
.... ABER die Titelzeile des Grids enthält immer noch alle Felder und ist genauso breit wie vorher. Das Grid weiß Sachen, die es nicht wissen soll/kann. :shock:


Schon mal mit der rechten Maustaste auf das Grid geklickt? (In der IDE).
Stichwort : SpaltenEditor.

Hansa 29. Apr 2003 13:36

Das ist schon klar. Aber das muß zur Lufzeit geschehen.
Code:
DBGrid1.Add
ohne Parameter!! Das kann nicht alles sein. Wo und wie muß ich sagen, daß eine Spalte hinzukommen soll? Vor allem aber, wie soll das überhaupt gehen, wenn eine Spalte rausfliegen soll :?: Mit Hide und Show des Grids geht das mal nicht einfach so.

Sharky 29. Apr 2003 13:53

Zitat:

Zitat von Hansa
Das ist schon klar. Aber das muß zur Lufzeit geschehen.
Code:
DBGrid1.Add
ohne Parameter!! Das kann nicht alles sein. Wo und wie muß ich sagen, daß eine Spalte hinzukommen soll? Vor allem aber, wie soll das überhaupt gehen, wenn eine Spalte rausfliegen soll :?: Mit Hide und Show des Grids geht das mal nicht einfach so.

hmm... dafür hast Du doch die Eigenschaft columns im Grid.

Delphi-Quellcode:
Var
 spalte : TColumns

begin
 spalte := RXdbGrid1.Columns.Add
 spalte.Field.Name
end;

Hansa 29. Apr 2003 14:08

Code:
DBGrid1.Column.Add;
das wird compiliert (laut Hilfe ist die Deklaration: function Add: TColumn;) Nur was wird wo geadded? Vor allem aber: wenn ich etwas hinzufügen kann, dann muß ich es auch wieder wegkriegen.

Sharky 29. Apr 2003 15:08

Zitat:

Zitat von Hansa
Code:
DBGrid1.Column.Add;
das wird compiliert (laut Hilfe ist die Deklaration: function Add: TColumn;) Nur was wird wo geadded? Vor allem aber: wenn ich etwas hinzufügen kann, dann muß ich es auch wieder wegkriegen.

Hai Hansa,

hier mal etwas Code. Du brauchst:

1 x Button
1 x Query
2 x ComboBox

Delphi-Quellcode:
procedure TForm1.ComboBox1Click(Sender: TObject); //Feld zum Grid zufügen.
var
 spalte  : TColumn;
begin
 spalte := RxDBGrid1.Columns.Add;
 spalte.FieldName := ComboBox1.Text;
 ComboBox2.Items.Add (ComboBox1.Text); // In die C-Box zum löschen der Spalte eintragen.
end;

{****************************************************}

procedure TForm1.ComboBox2Click(Sender: TObject); //Feld aus dem Grid löschen
begin
 RxDBGrid1.Columns.Delete (ComboBox2.ItemIndex);
 ComboBox2.Items.Delete (ComboBox2.ItemIndex);
end;

{****************************************************}

procedure TForm1.Button1Click(Sender: TObject); //Felder der Tabelle in ComboBox.
begin
 ComboBox1.Clear;
 ADOQuery1.GetFieldNames(ComboBox1.Items);
end;
ACHTUNG: Wenn einem Grid keine Spalten zugewiesen wurden werden immer alle Spalten der Tabelle angezeigt

Ich hoffe das hilft dir so.

oki 29. Apr 2003 15:10

Hi Hansa.

Sharky hat schon mal in die richtige Richtung geschossen.

Es gibt genau zwei Möglichkeiten (ohne riesen Aufwand).

Die erste ist die von Sharky benannte. du definierst zur Designzeit mittels Spalteneditor des DBGrid die Spalten, die du anzeigen möchtest. Der Vorteil ist, dass Du auch Spaltenbreite etc. voreinstellen und zur Erstellungszeit kontrollieren kannst.

Zweite Möglichkeit. Du gibst in Deiner Select-Anweisung nicht den Platzhalter * für alle Felder an, sondern nur die, die du im Grid sehen willst. Ist der Name doof, so kannst du ihn ja dort noch mit der as-Anweisung umbenennen.
Bsp.:

[/delphi]
select KdNr as Kundennummer from ...
[delphi]

Die dritte Variante zur Laufzeit die Columns des Grid zu kreieren verkneif ich mir hier. Das macht Arbeit und deshalb blöd (zumindest wenn es einfacher geht und so ausreicht).
Für ganz arbeitsame ist das aber dann eine Variante wo man dem Anwender nicht nur die Möglichkeit der Auswahl der anzuzeigenden Spalten, sondern auch noch das Design in die Hand geben kann (aber wer will das schon).

Gruß oki

[edit] Tschuldigung! :mrgreen: irgentwie paßt mein Beitrag nicht in die Reihenfolge. Aber vielleicht kannst du trotzdem was damit anfangen.

APP 30. Apr 2003 05:59

Hallo,

habe ich gerade gefunden: Sorting records in Delphi DBGrid.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:07 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