Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi DevExpress: Nach SQL Insert den neuen Datensatz fokussieren (https://www.delphipraxis.net/210469-devexpress-nach-sql-insert-den-neuen-datensatz-fokussieren.html)

haentschman 29. Apr 2022 09:44

DevExpress: Nach SQL Insert den neuen Datensatz fokussieren
 
Hallöle...8-)

Ich bräuchte mal eure Hilfe:

SOLL:
Ich möchte per SQL einen Datensatz einfügen. Nach dem Insert soll das Grid aktualisiert werden und die neue "ID" fokussiert werden. Highlight wäre dann.. der Datensatz fokussiert in den sichtbaren Bereich. (ggf. Filter ausblenden)

Alle Varianten, die ich probiert habe, funktionieren nicht...:cry: Der Focus, incl. Selection, steht entweder auf dem Ersten Datensatz oder irgendwo...:?

Beispiel:
Delphi-Quellcode:
procedure TfoBlubb.btnCopyClick(Sender: TObject);
var
  NewID: Integer;
begin
  NewID := FLogic.Copy(Query.FieldByName('ID').AsInteger);
  gtvBlubb.DataController.RefreshExternalData;
  TToolsDevExpress.SelectRecord(gtvAssignment, 'ID', NewID);
  pgcContent.ActivePage := tsLayout;
end;
.
.
.
class function TToolsDevExpress.SelectRecord(View: TcxGridTableView; FieldNameID: string; CurrentID: Integer): Boolean;
var
  I: Integer;
  ColumnIndex: Integer;
begin
  Result := False;
  ColumnIndex := TcxGridDBDataController(View.DataController).GetItemByFieldName(FieldNameID).Index;

  View.DataController.ClearSelection;
  for I := 0 to View.DataController.RecordCount - 1 do
  begin
    if View.DataController.Values[I, ColumnIndex] = CurrentID then
    begin
      View.DataController.SelectRows(I, I);
      View.DataController.FocusedRowIndex := I;
      Result := True;
      if Result then
      begin
        Break;
      end;
    end;
  end;
end;

Was mache ich falsch? :roll: Gibt es eine bessere Methode?

Danke...

tamasker 29. Apr 2022 12:14

AW: DevExpress: Nach SQL Insert den neuen Datensatz fokussieren
 
Hi

Ist der Grid evt. sortiert? Wenn ja, funktioniert es korrekt wenn du die Sortierung mal rausnimmst?

Liebe Grüsse

Union 29. Apr 2022 14:18

AW: DevExpress: Nach SQL Insert den neuen Datensatz fokussieren
 
Hast Du Dir mal die Property TopRowIndex angeschaut? Den Wert solltest Du vor dem Schließen merken und nach dem Öffnen wieder setzen.

oakley 30. Apr 2022 21:46

AW: DevExpress: Nach SQL Insert den neuen Datensatz fokussieren
 
Hey,

versuch mal das hier:

View.Controller.FocusRecord(i, false);
View.Controller.FocusedColumn := "Name der Tabellenspalte";

Setzt er Die hier den Focus schonmal in die richtige Zeile?

for I := 0 to View.DataController.RecordCount - 1 do ... geht nämlich über die Records in der Tabelle.

for i := 0 to View.DataController.RowCount - 1 do... nimmt die Zeile.

Deshalb wird bei View.DataController.FocusedRowIndex := I für i wenn Du über die Records iterierst der Recordindex genommen und nicht der Rowindex.

LG

Mirko

haentschman 2. Mai 2022 06:36

AW: DevExpress: Nach SQL Insert den neuen Datensatz fokussieren
 
Moin...:P

Sorry für die späte Rückmeldung. :wink: Ich hatte mal ein Wochenende ohne Arbeit...dafür den Garten...was auch Arbeit entspricht. :stupid:

Zum Thema:
Danke für die Rückmeldungen.

Zitat:

Ist der Grid evt. sortiert? Wenn ja, funktioniert es korrekt wenn du die Sortierung mal rausnimmst?
Grid ist sortiert. Wenn die Sortierung auf der Nummer steht, die Nummer dann eingefügt wird, steht der Datensatz als Erstes und wird damit fokusiert. Ist die Sortierung anders, ist zwar der Datensatz selektiert aber nicht fokusiert.
Zitat:

Hast Du Dir mal die Property TopRowIndex angeschaut?
Wenn ich richtig gelesen habe, ist der dafür da, den fokusierten Datensatz in den sichtbaren Bereich zu rücken. Oder? :gruebel:
Zitat:

Setzt er Die hier den Focus schonmal in die richtige Zeile?
Nein...:zwinker:

Ergebnis:
Ich habe mit den Vorschlägen herumgespielt...:wink:
Delphi-Quellcode:
class function TToolsDevExpress.SelectRecord(View: TcxGridTableView; FieldNameID: string; CurrentID: Integer): Boolean;
var
  I: Integer;
  ColumnIndex: Integer;
begin
  Result := False;
  ColumnIndex := TcxGridDBDataController(View.DataController).GetItemByFieldName(FieldNameID).Index;

  View.DataController.ClearSelection;
  for I := 0 to View.DataController.RowCount - 1 do
  begin
    if View.DataController.Values[I, ColumnIndex] = CurrentID then
    begin
      View.DataController.FocusedRecordIndex := I; //FocusedRowIndex geht nicht...immer erster Datensatz :-)
      View.Controller.FocusedRecord.Selected := True;
      Result := True;
      if Result then
      begin
        Break;
      end;
    end;
  end;
end;
Die ersten Tests waren erfolgreich und werden beobachtet... Der neue Datensatz wird eingefügt und fokusiert... :thumb:

DevExpress = learning by doing :stupid:

Danke...

oakley 2. Mai 2022 20:37

AW: DevExpress: Nach SQL Insert den neuen Datensatz fokussieren
 
Das der RecordIndex hier dem RowIndex entspricht muss nicht immer so sein.

Delphi-Quellcode:
 
class function TToolsDevExpress.SelectRecord(View: TcxGridTableView; FieldNameID: string; CurrentID: Integer): Boolean;
var
  I: Integer;
  ColumnIndex: Integer;
  recidx : Integer;
begin
  Result := False;
  ColumnIndex := TcxGridDBDataController(View.DataController).GetItemByFieldName(FieldNameID).Index;

  View.DataController.ClearSelection;
  for I := 0 to View.DataController.RowCount - 1 do
  begin
  recidx := View.ViewData.Rows[I].RecordIndex;

  if View.DataController.Values[recidx, ColumnIndex] = CurrentID then <-- I ist hier der Rowindex, DataController.Values will aber den RecordIndex und das kann hier zu Fehlern führen
    begin
      View.DataController.FocusedRecordIndex := recidx;
      View.Controller.FocusedRecord.Selected := True;
      Result := True;
      if Result then
      begin
        Break;
      end;
    end;
  end;
end;

haentschman 3. Mai 2022 05:26

AW: DevExpress: Nach SQL Insert den neuen Datensatz fokussieren
 
Liste der Anhänge anzeigen (Anzahl: 2)
Moin...8-)
Zitat:

Das der RecordIndex hier dem RowIndex entspricht muss nicht immer so sein.
...das werde ich nie begreifen. :oops: Den Unterschied Row,Record usw...

Die Änderung habe ich übernommen...:thumb:

oakley 3. Mai 2022 13:17

AW: DevExpress: Nach SQL Insert den neuen Datensatz fokussieren
 
Du kannst Dir das so vorstellen, dass der Rowindex die Reihenfolge der Zeilen von 0 bis x aufsteigend in Deiner Tabelle ist.
Der RecordIndex ist sowas wie die Nummerierung des Datensatzes der eingefügt wurde.

Sagen wir Du hast eine Zeile in deiner Tabelle. In diesem Fall ist, wenn nichts gelöscht wurde, der RecordIndex = RowIndex und zwar 0.
Wenn Du darüber jetzt eine Zeile einfügst, ist der RowIndex dieser neuen Zeile 0, der RecordIndex aber 1.

Mirko


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz