Announcement

Collapse
No announcement yet.

TCustomDBGrid -> SelectedRows

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

  • TCustomDBGrid -> SelectedRows

    Hallo!

    Folgende Situation: Ich habe ein DB Grid bei dem mehrere Zeilen markiert werden können. Auf die markierten Zeile können dann diverse Aktionen angewendet werden. Soweit geht alles.

    Ein Kunde wünscht sich allerdings nun, dass er auch mit der Tastatur einzelne Zeilen markieren kann. Zur Zeit kann man mit den Pfeiltasten zwar die aktuelle Zeile ändern, diese wird aber nicht in SelectedRows gespeichert. Da es sehr viele Funktionen gibt, die auf SelectedRows zugreifen, würde ich diese Funktionen ungerne ändern.

    Daher die Idee: Ich füge einfach die aktuelle Zeile in SelectedRows ein nach einem Tastendruck. Allerdings scheint das SelectedRows Objekt keine "Add" Funktion, sondern nur eine "Clear" und "Delete" Funktion zu besitzen.

    Frage: Wie kann ich eine Zeile zu "SelectedRows" hinzufügen?

  • #2
    Hat die Row selber keine Selected-Property, die man setzen kann?

    bye,
    Helmut

    Comment


    • #3
      diese wird aber nicht in SelectedRows gespeichert.
      Auch nicht mit ENTER o.a?
      Christian

      Comment


      • #4
        Nein SelectedRows wird auch nicht mit Enter gesetzt. Nur wenn du Zeilen wirklich markierst. Die Klasse macht einen Unterschied zwischen "Current Row" (da wo der schwarze Pfeil ist) und "Selected Rows" (die die wirklich markiert sind).

        Habe jetzt allerdings eine Lösung gefunden. Man muss einfach jedes Mal bei "KeyUp" CurrentRowSelected = true setzen, dann wird immer die aktuelle Zeile in SelectedRows gesetzt. Funktioniert leider nicht zusammen mit anderen Markierungen (alle anderen werden entfernt dabei), aber das brauch ich in diesem Fall zum Glück (noch) nicht.

        Comment


        • #5
          Salve,

          führe einfach eine liste mit den Datensatznummern die selektiert sind mit(int,bookmarks o.ä.).
          Wenn neu gezeichnet wird, kannst du dir die letzte position merken
          dann den datensatzzeiger auf die einzelnen positionen bringen und
          CurrentRowSelected(true) aufrufen, danach Refresh um ungültige zu löschen.
          Egal welche tastenkombination du verwendest.
          Ich persönlich habe einfach eine eigenen Klasse von TBookmarkList abgeleitet und
          alles was ich brauche als public deklariert.
          Diese dann dem dbgrid zuweisen und fertig.

          Aufpassen, du mußt keydown abfangen, damit deine selektierung nicht gelöscht wird
          <<<<
          procedure TCustomDBGrid.KeyDown(var Key: Word; Shift: TShiftState);
          var
          KeyDownEvent: TKeyEvent;

          procedure ClearSelection;
          begin
          if (dgMultiSelect in Options) then
          begin
          FBookmarks.Clear;
          FSelecting := False;
          end;
          end;
          >>>>


          gruß
          fred


          Auszug aus dataset falls es weiterhilft

          TBookmark *SavePlace;
          Variant PrevValue;

          // Positionsmarke ermitteln, damit zum selben Datensatz zurückgekehrt werden kann

          SavePlace = Table1->GetBookmark();

          Table1->FindPrior();// zum vorherigen Datensatz verschieben

          PrevValue = Table1->Fields->Fields[0]->Value; // Wert ermitteln

          // Zurück zur Positionsmarkierung

          // eventuell ist dies nicht mehr der nächste Datensatz,
          // wenn die Datenmenge asynchron von anderer Stelle geändert wurde
          Table1->GotoBookmark(SavePlace);
          Table1->Fields->Fields[0]->Value = PrevValue; // Wert definieren
          Table1->FreeBookmark(SavePlace);

          Comment

          Working...
          X