DBGrid Columns entfernen?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
TT73GP7
Beiträge: 233
Registriert: Di 29. Mär 2016, 20:45

DBGrid Columns entfernen?

Beitrag von TT73GP7 »

Hallo zusammen,

und schonwieder mein lieblings Thema
das liebe DB Grid

also ich habe das nach meinen Bedürfnissen etwas angepasst und vererbe es eigentlich nur noch
nun kann es aber vorkommen das ich es auf eine Form packe und vorher war es noch auf einer andereren Form

nun sind aber noch viele leere Columns drin
die würde ich natürlich gerne raus haben

meine Idee war es so zumachen

Code: Alles auswählen

 
  for i := 0 to (DBGrid1.Columns.Count -1) do begin
    DBGrid1.Columns.Delete(i);
 end;     
 


und anschliessend wieder die Columns hinzufügen die ich wirklich brauche
hach nur leider wird nicht eine Column entfernt?

was mache ich falsch?

Viele Grüße
:)

Thomas B.
Beiträge: 90
Registriert: Fr 2. Nov 2007, 13:32
OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Ulm

Re: DBGrid Columns entfernen?

Beitrag von Thomas B. »

Ich kenne mich mit der Komponente nicht aus. Aber vielleicht gibt es ein Columns.Clear?
Übrigens, sollte die Delete-Schleife von (DBGrid1.Columns.Count -1) beginnend Rückwärts (downto) noch 0 laufen - sonst gibt es einen Zugriffsfehler.

Erwin
Beiträge: 225
Registriert: Mi 16. Sep 2009, 14:15
OS, Lazarus, FPC: Xubuntu 16.04 / x86_64_linux-gtk 2 / L 1.6+dfsg-1 / FPC 3.0.0

Re: DBGrid Columns entfernen?

Beitrag von Erwin »

Also zuerst sah es für mich auch so aus, als müsste es funktionieren. Aber dann fiel mir ein, wir reden (bzw. schreiben) hier ja von Datenbank-Grids? Da hatte ich auch mal so meine Probleme gehabt, weil die DBGrid ja meist jene Colums (und Rows) darstellt, die von der DataSource (glaube, diese ist es) übermittelt wird, bzw. letztendlich von der Datenbank selbst übermittelt bekommt. Deshalb klappt es bei DBGrid nicht. Man kann nur dies in so weit ändern, ob die Columns angezeigt werden soll, oder nicht. Ansonsten muss (und kann) man bei DataSource eingreifen, glaube ich. Weiß es leider auch nicht mehr so genau. Schon lange her. Aber eine Änderung in der Richtung würde dann auch dazu führen, dass die Datenbank selbst ebenfalls bearbeitet/geändert wird.

Ist aber, wie gesagt, lange her. Kann sein, dass ich mich da ein wenig falsch erinnere. Vielleicht ist es auch nicht DataSource, sondern DataSet? Aber in einem bin ich mir ziemlich sicher: DBGrid lässt sich zumindest ab dann, wenn es erst mal mit einer Datenbank verbunden ist, nicht so leicht ändern wie eine einfache StringGrid.
Win 7 / Lazarus 1.6 / FP 3.0.0 / x86_64-win64-win32/win64

wp_xyz
Beiträge: 3442
Registriert: Fr 8. Apr 2011, 09:01

Re: DBGrid Columns entfernen?

Beitrag von wp_xyz »

Beim Löschen über Indices ist die Grundregel, die Schleife immer von oben nach unten laufen zu lassen (for...downto). Im umgekehrten Fall (for ... to) beginnst du mit dem Löschen der Spalte mit dem Index 0, die Spalte 1 rutscht an die Position 0, der Schleifenindex erhöht sich auf 1, aber auf IndexPosition 1 ist nun die Spalte mit dem ursprünglichen Index 2 usw. --> es bleibt die Hälfte der Spalten vorhanden! Wenn du dagegen von oben nach unten löschst, kann nichts "nachrutschen":

Code: Alles auswählen

for i:= DBGrid.Columns.Count-1 downto 0 do 
  DBGrid.Columns.Delete(i);
 
// oder ganz ohne Laufindex immer das aktuell erste Element löschen
while DBGrid.Columns.Count > 0 do
  DBGrid.Columns.Delete(0);

Dazu kommt noch, dass die Spalten eines DBGrids nicht autark sind wie in einem StringGrid, sondern von der darunterliegenden Tabelle abhängen. Ich könnte mir vorstellen, dass die Tabelle von dem Löschen der Gridspalten nichts mitkriegt und daher die Spalten bei der nächsten Gelegenheit wieder herstellt. --> Mit persistenten Feldern arbeiten?
Zuletzt geändert von wp_xyz am Mo 1. Aug 2016, 09:43, insgesamt 1-mal geändert.

TT73GP7
Beiträge: 233
Registriert: Di 29. Mär 2016, 20:45

Re: DBGrid Columns entfernen?

Beitrag von TT73GP7 »

hach

perfekt

immer diese Flüchtigkeitsfehler :(

vielen dank nun läuft es :)

Antworten