Welches Ereignis wird jedes Mal ausgelöst, wenn der ausgewählte Speicherort eines TDbGrid geändert wird?

Eigenschaft festgelegt ist.

Leider wird nicht ausgelöst, wenn der Benutzer mit der Tastatur navigiert, während die dgRowSelect-Option aktiviert ist und es keinen OnRowEnter gibt. Und das OnKeyDown-Ereignis wird ausgelöst, bevor die Auswahländerung vorgenommen wurde. Ich versuche, hier eine datenbewusste Version einer TListBox zu simulieren, und ich benötige etwas, um den OnClick-Handler der List Box zu ersetzen, der trotz des Namens tatsächlich abgeht, wenn die Auswahl geändert wird, sei es mit der Maus oder der Tastatur. Gibt es eine Möglichkeit, dies mit einem TDbGrid zu tun? Wenn nicht, muss es ein anderes Netzsteuerelement geben, das es tun wird. Weiß jemand, was es ist? (Vorzugsweise Open Source?)

unten in der Zelle.

  • Das ausgewählte Feld oder SelectedIndex Schlüssel.

  • Der Benutzer klickt mit der Maustaste Benutzer verwendet die Tabulatortaste oder die Home- none

    Ich habe ein TDbGrid in meinem Projekt, und ich versuche, jedes Mal, wenn ich die ausgewählte Zeile ändere, ein Ereignis abgehen zu lassen. Jede Änderung in der Zeile aktualisiert bereits alle datenbewussten Steuerelemente, die mit derselben DataSource verknüpft sind, aber es müssen auch andere Änderungen vorgenommen werden, für die ich einen Ereignishandler benötige.

    Ich dachte, OnColEnter würde funktionieren. Laut Hilfedatei wird es ausgelöst, wenn:

    • Der Benutzer navigiert zur Zelle mit

  • Antwort auf "Welches Ereignis wird jedes Mal ausgelöst, wenn der ausgewählte Speicherort eines TDbGrid geändert wird? " 4 von antworten

    Haben Sie das OnDataChange-Ereignis von DataSource ausprobiert?

    Verwenden Sie OnDataChange, und behandeln Sie den Fall, in dem Sie das Dataset laden, fügen Sie eine boolesche Prüfung als erste Zeile der Routine hinzu, und legen Sie diese Option auf false fest, wenn das Laden abgeschlossen ist.

    procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
    begin
      if fbLoading then exit;
      // rest of your code here
    end;
    
    procedure TForm1.Form1Create(Sender:tObject);
    begin
      fbLoading := true;
      // load your table here     
      fbLoading := false; 
    end;
    

    OnDataChange ist eine Wahl. Die andere ist auf TDataset-Seite das Ereignis AfterScroll. Meistens fand ich es praktischer als OnDataChange; da in OnDataChange ein Scrollereignis mit dem Field-Parameter nil kommt (was eine Falle ist und eine der Ursachen für ihre AVs sein kann, die es codieren).

    Ich würde AfterScroll nur für das Dataset verwenden, es wird ausgelöst, wenn Sie das Dataset zum ersten Mal öffnen, und jedes Mal, wenn Sie es verschieben. In einem DBGrid, das wäre auf jeden Klick auf eine Zeile, oder die Scrollleiste, oder mit der Tastatur (Home, Edn, Up, Down, PgUp, PgDown) ... Etc.

    Sie können es sogar dynamisch zuweisen, wenn Sie dasselbe Dataset in vielen verschiedenen Formularen verwenden (entweder in Create/Free oder Show/Close):

    procedure TForm1.myAfterScroll(DataSet: TDataSet); 
    begin
       //do your thing here
       if oldAfterScroll<>nil then
          oldAfterScroll(DataSet);
    end;
    
    constructor TForm1.Create(AOwner: TComponent);
    begin
       oldAfterScroll:=DBGrid1.DataSet.OnAfterScroll;
       DBGrid1.DataSet.OnAfterScroll:=myAdrerScroll;
    end;
    
    destructor TForm1.Free;
    begin
       DBGrid1.DataSet.OnAfterScroll:=oldAfterScroll;
    end;