Announcement

Collapse
No announcement yet.

DBGrid Zeilennummer des Datensatzes

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DBGrid Zeilennummer des Datensatzes

    Hallo,<p>
    es gibt hier ja schon einige Diskussionen zum Thema Einfärben von Zeilen im DBGrid.<br>
    Gibt es denn eine Möglichkeit, irgendwie im DrawCell Ereignis die Zeilennummer des Datensatzes herauszufinden ?<br>Bei Tabellen, die mir bekannt sind, nehme ich eine AutoIncremet-Spalte und teste, ob sie gerade oder ungerade ist (Table1ID.AsInteger mod 2=0).<br>Aber was macht man, wenn man die Tabelle nicht kennt (z.B. im DB-Browser) ?<br>
    Vielleicht hat ja jemand einen guten Tip.<p>
    Gruß Marcus

  • #2
    manchmal (je nach DBMS) funktioniert RecNo

    Comment


    • #3
      Hallo Joachim,<p>
      leider aber nicht bei SQL-Datenbanken wie Interbase. Gibt es denn die Möglichkeit, zu einer geöffneten TQuery (ohne persistente Felder) ein AutoInc-Feld (delphiseitig) hinzuzufügen ?<p>
      Marcu

      Comment


      • #4
        Hui Marcus,
        nicht, dass ich wüßte. Gibt es bei Interbase ein ROWNUM o.ä.?
        <PRE>
        SELECT ROWNUM, * FROM mytable
        </PRE&gt

        Comment


        • #5
          Hallo Marcus,<BR><BR>mit ADODataSet steht wie schon gesagt die Eigenschaft RecNo zur Verfügung, dann ist es ja einfach. In deinemm Fall ist die Sache natürlich schon ziemlich schwierig. Ich hab da mal was probiert:<PRE>procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);
          var
          aColor : TColor;
          aStringGrid : TStringGrid;
          iCol, iRow : Integer;
          begin
          aStringGrid := TStringGrid(DBGrid1);
          aStringGrid.MouseToCell(Rect.Left, Rect.Top, iCol, iRow);
          //
          if Odd(iRow) then aColor := clRed else aColor := clGreen;
          DBGrid1.Canvas.Brush.Color := aColor;
          DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
          end;
          </PRE>Die Sache hat natürlich ein paar Haken, z.B. musst du bei jeder Bewegung im Grid alles(!) neu zeichnen lassen, da sonst nicht immer alles richtig aussieht. Leider ist auch die oberste Reihe dann immer in der gleichen Farbe, beim Scrollen ändern also die Datensätze praktisch ihre Farbe, das ist auch nicht so schön, aber vielleicht ist das ja zumindest ein Ansatz für neue Überlegungen.<BR><BR>Viele Grüße Ola

          Comment


          • #6
            Vielen Dank,<p>
            Olaf, es funktioniert recht gut, leider gibt es beim Scrollen der Tabelle (mit Cursortasten) falsche Farbfolgen.<br>
            Ich habe da noch einen anderen Ansatz zumindest für den IB. Es gibt da ein Feld RDB$DB_KEY, das für jeden Datensatz eine "Hausinterne" Nummer liefert. Die wird leider im DBGRid nicht dargestellt.<br>
            Ich habe eine Abfrage ausprobiert: "select t.rdb$db_key,t.* from tabelle t" und das hat funktioniert. Leider ist RDB$DB_KEY eine besondere Hexzahl und sie muss ein Integer umwandelt werden.<br>
            Dazu gibt es einen Betrag von Andreas Kosch vom 27.11.2001: eine TField.GetText-Routine erledigt das Umwandeln. Leider funktioniort diese Routine bei mir nicht, ich bekomme in jeder Zeile als DB_KEY die selbe Zahl 0000008300000000 geliefert. Vielleicht liegt das daran, dass ich keine persistenten Felder verwende

            Comment


            • #7
              Hallo Marcus,<BR><BR>mit dem IB und dem Drumherum kenne ich mich leider nicht aus, aber was ist für dich am Ende jetzt eigentlich das Ziel? Möchtest du das Grid nach einem Muster einfärben und die Datensatznummern sind nur Mittel zum Zweck oder legst du direkten Wert auf Datensatznummern?<BR>Übrigens, wenn du ein DBGrid1.Repaint beim Ereignis ...Table.AfterScroll aufrufst, dann sehen bei mir die Farben i.O. aus. Du kannst die ganze Sache ja auch noch weitertreiben indem du die Anzahl der gescrollten Zeilen ermittelst bzw. selbst bestimmst, und kannst dann so perfekten Einfluss auf das Einfärben nehmen.<BR>Für eine fortlaufende Nummer wäre dieses System auch geeignet. Nach dem Öffnen kennst du den ersten Datensatz, nummerierst also von 1 aufwärts, und kannst dann abhängig von der Anzahl gescrollter Zeilen die Zeilennummern neu zeichnen.<BR><BR>Viele Grüße Ola

              Comment


              • #8
                Hallo Olaf,<p>
                das sind wirklich sehr interessante Ansätze, die ich jetzt ausprobieren werde - vielen Dank.<br>Ich möchte eigentlich echt nur abwechselnd (clWindow/clInfoBk) eingefärbte Zeilen darstellen. Mit persistenten Feldern und dem DBGrid festzugeordneter Tabelle auch kein Problem, weil meine Tabellen alle einen Primärschlüssel (Integer) "ID" haben, aber bei z.B. einem Datenbank-Browser hat man keine persistenten Fields.<p>
                Gruß Marcu

                Comment

                Working...
                X