![]() |
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? |
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 |
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 ?
|
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 ![]() Im übrigen ist der Entwickler von ibobjects auf der diesjährigen europäischen firebird Konferenz im Mai in Fulda. Schaut doch mal bei ![]() Kommen einige Leute aus dem Forum hier zur firebird Konferenz? |
Hi,
es die die zugehörige Column-Komponente als Parameter übergeben, und dann geht es so weiter: Column.Field.DataSet etc.. Tschüss Wolfgang |
wie, wo was ? wo ist da ein Parameter?
[edit=Daniel B]Doppelpost gelöscht. MfG Daniel B.[/edit] |
Hi,
der Rumpf der von Delphi erzeugten Ereignisbehandlungsroutine
Code:
procedure TForm5.DBGrid1TitleClick([size=18]Column: TColumn[/size]);
begin Column.Field.DataSet end; |
Zitat:
Delphi-Quellcode:
Das ist natürlich die minni lösung. Aber als Lösungsansatz sollte es reichen.
procedure TFRM_Main.DBGrid1TitleClick(Column: TColumn);
begin Query1.Close; Query1.SQL.Text := 'SELECT * FROM tabelle ORDER BY ' + Column.FieldName; Query1.Open; end; |
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. |
Zitat:
Aber das ist leich einzufügen. |
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) ? |
Noch eine kurze Frage: Wie kann ich denn in der Titelleiste die Spalte, nach der sortiert wird irgendwie hervorheben :?:
|
Zitat:
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. |
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:
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:
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; |
Zitat:
Schon mal mit der rechten Maustaste auf das Grid geklickt? (In der IDE). Stichwort : SpaltenEditor. |
Das ist schon klar. Aber das muß zur Lufzeit geschehen.
Code:
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.
DBGrid1.Add
|
Zitat:
Delphi-Quellcode:
Var
spalte : TColumns begin spalte := RXdbGrid1.Columns.Add spalte.Field.Name end; |
Code:
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.
DBGrid1.Column.Add;
|
Zitat:
hier mal etwas Code. Du brauchst: 1 x Button 1 x Query 2 x ComboBox
Delphi-Quellcode:
ACHTUNG: Wenn einem Grid keine Spalten zugewiesen wurden werden immer alle Spalten der Tabelle angezeigt
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; Ich hoffe das hilft dir so. |
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. |
|
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