2016-06-11 19 views
-2

Gibt es eine Möglichkeit, die cxGrid Funktionalität "Gehe zur nächsten Zelle bei der Eingabe" aber mit den Pfeiltasten auf der Tastatur statt von "Enter" zu schlagen ???cxGrid: statt "Gehe zur nächsten Zelle bei der Eingabe" mit "Enter" mache das mit den Pfeiltasten

Jetzt kann ich mit den Pfeiltasten navigieren, aber die Zellen, auf die ich mich bewege, sind nicht ausgewählt (blaue Farbe). Wenn ich eine Zelle in der Spalte bearbeite und in die Zelle darunter (mit der Pfeiltaste) gehe, springt das Raster auf einen anderen zufälligen Datensatz im Raster, was nervig ist.

Ist es eine Frage der Einstellungen oder müssen Sie diese Funktionalität programmieren?

bearbeiten: Dies ist eine einfache temporäre Tabelle, die ich verwenden, um Daten zu sammeln. Es hat keine indizierten Felder oder AutoInc Feld:

procedure TForm3.cxButton1Click(Sender: TObject); 
begin 
DataModule2.ACRQuery2.Close; 
DataModule2.ACRQuery2.SQL.Clear; 
DataModule2.ACRQuery2.SQL.Text :='insert into TEMP select company_id,member_id,surname,name from MEMBERS where company_id =:a1'; 
DataModule2.ACRQuery2.Params.ParamByName('a1').Value :=cxLookupComboBox2.Text; 
DataModule2.ACRQuery2.ExecSQL; 

DataModule2.ACRQuery3.Close; 
DataModule2.ACRQuery3.SQL.Clear; 
DataModule2.ACRQuery3.SQL.Text :='update temp set month=:a1,year=:a2'; 
DataModule2.ACRQuery3.Params.ParamByName('a1').Value :=cxComboBox2.Text; 
DataModule2.ACRQuery3.Params.ParamByName('a2').Value :=cxTextEdit2.Text; 
DataModule2.ACRQuery3.ExecSQL; 

DataModule2.TEMP.Refresh; 
end; 

Datenlasten, aber wenn ich den ersten Datensatz bearbeiten und nach unten mit dem Pfeil bewegen, springt der Cursor an das Ende des Gitters.

enter image description here

Navigation mit den Pfeiltastenfunktionen normally.I die Spalte ohne Problem nach unten scrollen und bearbeiten jeden Datensatz Ich mache eine Pause auf. Aber sobald ich es bearbeite und zum nächsten Datensatz gehe, springt der Cursor irgendwo anders hin. Es scheint, dass die Synchronisierung nicht funktioniert. Ich weiß es wirklich nicht. Ich sortiere in keiner Weise.

Die temporäre Tabelle: enter image description here

+2

Haben Sie versucht, Fragen in den DevEx Support-Foren zu stellen? –

+1

In Reflektion, bis dieses q bearbeitet wird, um ein MCVE einzuschließen, stimme ich ab, es als Off-Thema zu schließen, weil das "Springen" nicht das Standardverhalten eines CxGrids ist ** und ** die Pfeiltasten-Navigation die Standardeinstellung ist für ein cxGrid. Daher sollte das q genügend Informationen enthalten, um das Problem zu reproduzieren. – MartynA

+0

@MartynA - Sortierreihenfolge ist keine. – user763539

Antwort

2

Ist es eine Frage der Einstellungen oder müssen Sie diese Funktion programmieren?

Ja, es ist eine Frage der Einstellungen und es erfordert keinen Code. Es gibt jedoch offensichtlich ein Problem in Ihrem Projekt, das Sie zuerst klären müssen.

Wenn Sie sagen "das Raster springt zu einem anderen zufälligen Datensatz im Raster, was nervig ist.", Klingt es, als ob Sie von der falschen Stelle aus starten und versuchen, das gewünschte Navigationsverhalten zu erhalten, weil Sie springen das sollte sicher nicht passieren. Und das ist in keinem cxGrid-Projekt der Fall.

Wie auch immer, ich finde, dass die Darstellung einer cxGridDBTableView im Objektinspektor es manchmal schwierig macht, "das Holz für die Bäume zu sehen". Was ich dann mache ist, ein Projekt zu verwenden, das das Gitter komplett im Code erstellt - siehe unten.

unten Der Code ist völlig eigenständig und benötigt keine Event-Handler, persistent TFields, etc. Wenn Sie es versuchen, sollten Sie diese standardmäßig als erstellt finden, das Gitter tut Unterstützung nach oben und unten und linke und rechte Zellennavigation unter Verwendung der Cursortasten. Die einzige Ausnahme ist, dass die linken und rechten Tasten nicht für die Zellennavigation funktionieren, wenn der aktuelle Zelleninhalt bearbeitet wird. Wenn Sie jedoch Kommentar- der Linie

cxView.DataController.Options := cxView.DataController.Options + [dcoImmediatePost]; 

dann, Pressen Enter während in einer Zelle Bearbeitung sofort die Bearbeitung zurück zu dem Datensatz Pfosten und das Netz wird ermöglicht es Ihnen, aus der Zelle zu navigieren, indem Sie mit der linken - oder Rechts-Pfeiltaste. Ich bin mir sicher, dass es bessere Möglichkeiten gibt, diesen Effekt zu erreichen, indem die Schlüsselverarbeitung im Code verarbeitet wird, aber zumindest hat die Methode dcoImmediatePost den Vorteil, dass kein Code benötigt wird.

Wenn die App startet, sollten Sie sehen, dass die oberste Zeile "hervorgehoben" ist (standardmäßig blau), mit Ausnahme der LH-Zelle, die fokussiert ist.

Ich hoffe, dieses Beispiel wird Ihnen helfen, die Ursache des "Springens" in Ihrem Projekt zu identifizieren und kann Ihnen auch helfen, Ihre Beschreibung dessen, was Sie erhalten möchten, im Hinblick auf die Cursortastennavigation zu verfeinern.

-Code

procedure TForm1.CreateGrid; 
begin 
    cxGrid := TcxGrid.Create(Self); 
    cxGrid.Parent := Self; 
    cxGrid.Width := 400; 

    cxLevel := cxGrid.Levels.Add; 
    cxLevel.Name := 'Firstlevel'; 

    cxView := cxGrid.CreateView(TcxGridDBTableView) as TcxGridDBTableView; 
    cxView.Name := 'ATableView'; 
    // Uncomment the following line to make the grid respond to the `Enter` key by posting any pending change to the data row 
    // cxView.DataController.Options := cxView.DataController.Options + [dcoImmediatePost]; 

    cxView.DataController.KeyFieldNames := 'ID'; 

    cxLevel.GridView := cxView; 

    cxView.DataController.DataSource := DS1; 

    cxView.DataController.CreateAllItems; 

end; 

function CreateField(AFieldClass : TFieldClass; AOwner : TComponent; ADataSet : TDataSet; 
AFieldName, AName : String; ASize : Integer; AFieldKind : TFieldKind) : TField; 
begin 
    Result := AFieldClass.Create(AOwner); 
    Result.FieldKind := AFieldKind; 
    Result.FieldName := AFieldName; 
    Result.Name := AName; 
    Result.Size := ASize; 
    Result.DataSet := ADataSet; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    i : Integer; 
    Field : TField; 
begin 

    Field := CreateField(TAutoIncField, Self, CDS1, 'ID', 'CDS1ID', 0, fkData); 
    Field := CreateField(TBooleanField, Self, CDS1, 'Marked', 'CDS1Marked', 0, fkData); 
    Field := CreateField(TStringField, Self, CDS1, 'Name', 'CDS1Namefield', 20, fkData); 
    Field := CreateField(TStringField, Self, CDS1, 'Value', 'CDS1Valuefield', 20, fkData); 

    CDS1.CreateDataSet; 

    CDS1.IndexFieldNames := 'ID'; 

    for i := 1 to 5 do begin 
    CDS1.Insert; 
    CDS1.FieldByName('Marked').AsBoolean := Odd(i); 
    CDs1.FieldByName('Name').AsString := 'Name' + IntToStr(i); 
    CDs1.FieldByName('Value').AsString := 'Value ' + IntToStr(i); 
    CDS1.Post; 
    end; 

    CDS1.First; 

    CreateGrid; 

    ActiveControl := cxGrid; 

end; 
+0

Nun, in meinem Raster tritt der 'Sprung' auf. Wenn ich die erste Zelle einer Spalte bearbeite und mit dem Pfeil nach unten zur nächsten Zelle gehe, wechselt das Gitter den Fokus auf die zehnte Zelle unter Überspringen von 9 Zeilen. Dies geschieht nur beim Bearbeiten. Die Navigation an sich funktioniert. Ich hätte gerne Excel-Verhalten. – user763539

+0

Nun, es sollte natürlich nicht so springen, und mein Beispielprojekt beweist, dass Sprünge nicht standardmäßig passieren. Sie müssen die Ursache dafür selbst finden. F.i. Wenn Sie eine Bearbeitung durchführen, die zu einem Sprung führt, ändert das Edit dann ein Feld, in dem Ihre Datei indexiert ist? Übrigens, nach SO-Regeln, wenn Sie ein "Warum funktioniert das nicht?" Frage, Sie sollten MCVE in Ihre Frage aufnehmen. – MartynA

+0

"Sie müssen die Ursache finden" Vielleicht haben Sie eine Rasterspalte, deren SortOrder auf SoAscending oder SoDescending gesetzt ist? – MartynA

0

Nach unzähligen Experimenten Ich glaube, ich das Problem gefunden haben: Es scheint, dass diese Funktion der Daten-Controller zu verwenden, muss auf „Grid-Modus“ eingestellt werden.

+0

Entschuldigung, als allgemeiner Vorschlag, die Idee, dass GridMode True sein muss, um Pfeil-Taste-Navigation zu bekommen, ist einfach falsch. GridMode ist standardmäßig False. Wenn Sie also Ihr Problem auf True setzen, ist die Ursache etwas, das Sie uns in Ihrem q nicht mitgeteilt haben. – MartynA

+0

Ich habe in diesen Tagen Deevexpress-Dokumentation gelesen. Von ihnen: "ExpressDataController im Standard-Daten laden Modus nur seine Datensätze sortiert, während die Datensatzreihenfolge des zugrunde liegenden Datensatzes nicht betroffen ist. Dies ermöglicht unsere Kontrollen mit großen Datenmengen besser bedeutet jedoch, dass die Reihenfolge der Datensätze des Datencontrollers und des Datensatzes nicht mehr synchronisiert ist und Sie somit den beschriebenen Effekt-Cursor "springt" ... Es scheint, dass der Sync-Modus nicht richtig funktioniert. – user763539

+0

Ok, als Das ist anscheinend das, was Devex gesagt hat, ich habe meine Vote-to-Close zurückgezogen. Ich habe dieses Springen nie selbst erlebt, in 20 Jahren mit dem cxGrid und seinen Vorläufern. Es ist immer noch schade, dass Sie kein MCVE bereitgestellt haben – MartynA

Verwandte Themen