Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - DBGrid: Warum sind markierte Zeilen nicht gleich selektiert?


RainerT - Di 05.08.03 16:17
Titel: DBGrid: Warum sind markierte Zeilen nicht gleich selektiert?
Hallo zusammen,

ich habe ein DBGrid in dem ich den Inhalt einer Datenbank anzeige (klar, was sonst?). Jetzt möchte ich gerne einen Eintrag markieren und diesen per Button-Klick in eine String-List schreiben.

Im großen und ganzen keine tolle Tat, wenn ein Record selektiert ist, dann kann ich ja mit "SelectedRows" usw. den Datensatz finden.

aaaber... markiert ist ja noch lange nicht selektiert. Z.B. wenn das Grid den Fokus bekommt ist die erste Zeile markiert - "SelectedRows.Count" ist aber null. Genauso wenn ich die Markierung mit den Pfeiltasten rauf und runter schiebe, dann ist der satz auch erstmal nur markiert, nicht selektiert.

Aber dem Anwender dürfte ich den Unterschied nur schwer erklären können, zumal man es ja nichtmal sieht, wenn der Indikator nicht davor ist...

Hat dieses Problem schon mal jemand gelöst? Und wenn dann wie? Kann ich irgendwie rauskriegen, welche Zeile im Grid markiert ist und diese dann programmseitig auf Selected setzen?

BTW, das Grid ist nicht editierbar und RowSelect und MultiSelect stehen auf true.

Danke für Eure Antworten.


Stoffel1984 - Mo 17.05.04 10:03

das würde mich auch mal interessieren - hat jemand ne idee?

gruß, stoffel


mexx2k - Mo 08.10.07 10:08

Leider hat anscheinend noch keiner eine Lösung gefunden...

Ich habe auch ein DB Grid und möchte auslesen, welche Zeilen markiert sind.
Leider blieb ich bisher auf der langen Suche nach einer Lösung erfolgslos.


jasocul - Mo 08.10.07 11:03

Ich halte dieses Verhalten eines DBGrid für sinnvoll. Nur weil es mal den Focus erhält, kann doch deswegen der Datensatz nicht gleich als markiert gelten. Desgleichen gilt, wenn der Anwender durch das Grid blättert. Insbesondere bei MultiSelect.

Meine Idee:
Da ich im Moment nicht weiß, ob ein DBGrid ein entsprechendes Event hat, kann man auch über das OnChange der DataSource (oder war es das DateSet? :gruebel: ) gehen. In dem Fall setzt man den Markiert-Status manuell.


mexx2k - Mo 08.10.07 14:19

Nur was machste bei Multiselect?


raiguen - Mo 08.10.07 18:01

Moin :-)
Ich habe dieses Problem - ebend zum besseren Benutzerverständnis - wie folgt gelöst:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
var  bmIndex: integer;
begin
   if DBGrid1.SelectedRows.Find(Column.Field.DataSet.Bookmark, bmIndex) then
     begin
       DBGrid1.Canvas.Brush.Color:= clTeal;
       DBGrid1.Canvas.FillRect(Rect);
   end;
   DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

Alle selektierten Zeilen im DBGrid werden mit einer 'besonderen' Farbe gemalt, während die markierte Zeile weiterhin mit der Systemfarbe gepinselt wird und die restlichen Zeilen halt mit der 'Grundfarbe' des DB Grids.
WICHTIG: DBGrid1.DefaultDrawing MUSS auf true gesetzt sein :!: