dataGridView Enter Taste im EditMode



  • Hi,

    habe ein nicht gebundendes Datagridview mit meheren Zeilen. Ich reagiere auf das KeyDown Event, mache eine Abfrage ob es sich um die Enter Taste handelt und springe, falls es so ist, eine Zelle nach rechts. Wenn sich die Zelle aber im EditMode befindet, wird stattdessen die Zelle darunter fokussiert. Wie kann ich das Unterbinden? Ich kann zwar im Ereignis CellValidating

    e->cancel = true;
    

    setzen, aber dann verharre ich nur im Edit Mode.

    Thx



  • Keiner ne Idee? Eine Lösung wäre Vererbung. Geht doch aber bestimmt auch anders, oder?



  • Ich finde das DataGridView auch irgendwie tricky, siehe mein Posting weiter unten.
    Um auf deine Frage einzugehen, müßte man aber mal den Code von KeyDown des DataGridView sehen. Wie springst du dort nach rechts ? Hast du dir mal die Methode EditingControlShowing angesehen? Vielleicht kannst du dort was anfangen.



  • Hey,

    danke für deinen Tip.

    Hier der Code:

    if(e->KeyCode == Keys::Return)
    {
       dataGridView1->CurrentCell = dataGridView1->Rows[r]->Cells[c+1];
    }
    

    Wobei r und c die aktuelle row und cell enthalten...

    Sobald ich aber den Edit Modus verlasse, springt die aktuelle Zelle eine Etage tiefer in die nächste Zeile.

    Mit deinem Tip sehe ich zwar wann ich in den Edit Mode komme, und editieren möchte ich die Zelle ja auch, aber dann möchte ich beim Verlassen des Modes (CellEndEdit) das standard Verhalten abbrechen und die von mir gewünschte Zelle aufrufen.
    Das muss doch gehen...

    PS nutzt .net2.0



  • Dann wäre also die nächste Frage, in welcher Methode des dataGridView stellst du wie die aktuelle Reihe r fest, die du dann in der Funktion verwendest.



  • Hi,

    na über die Eigenschaft CurrentCell...

    int c = dataGridView1->CurrentCell->ColumnIndex;
    int r = dataGridView1->CurrentRow->Index;
    

    Es klappt halt auch, solange ich nicht im Editmode bin.



  • Wie soll dir geholfen werden, wenn du die Fragen nicht beantwortest?
    In welcher Methode stellst du die Reihe fest ? In KeyDown oder eher ?



  • Hi,

    wie im ersten Post geschrieben im KeyDown Event.

    Ich reagiere auf das KeyDown Event



  • So, ich habe jetzt extra für dich etwas herumexperimentiert:
    Das normale Verhalten des dataGridView bei der Enter-Taste ist bei mir: der Cursor springt eine Reihe nach unten.
    Du willst jetzt dieses Verhalten ändern.

    Dein bisher häppchenweise geposteter Code funktioniert bei mir dergestalt, daß der Cursor nicht nur ein Feld nach unten, sondern zusätzlich ein Feld nach rechts springt. Um nur ein Feld nach rechts zu springen, muß es so lauten:

    int c = dataGridView1->CurrentCell->ColumnIndex;
    int r = dataGridView1->CurrentRow->Index; 
    
    if(e->KeyCode == Keys::Return)
    {
       dataGridView1->CurrentCell = dataGridView1->Rows[r-1]->Cells[c+1];
    }
    

    Dann mußt du natürlich noch den Fall berücksichtigen, daß du am Ende der Reihe angekommen bist, da kann er nicht mehr ein Feld nach rechts springen, sondern z. B. an den Anfang der nächsten Reihe, falls eine solche existiert.

    Und jetzt kommt der Knackpunkt (ich erwähnte schon, daß das dataGridview ein paar Merkwürdigkeiten hat):
    Wenn sich eine Zelle im Editiermodus befindet, wird überhaupt kein KeyDown Event ausgelöst. Das hättest du mit dem Debugger sehr leicht selbst herausfinden können.

    Eine Möglichkeit wäre, hierfür das EditingControlShowing Event zu nehmen, das ich schon oben erwähnte und innerhalb dieses Events einen eventHandler für editingControl->TextChanged zu initialisieren, diesen dann in CellEndEdit wieder zu enfernen.
    Ich hoffe, du findest im Netz Code dazu. Ich selbst habe das ganze in C# realisiert, sie meine Posting hier weiter unten, wo ich ein paar Merkwürdigkeiten dazu dargestellt habe.
    Viel Erfolg !



  • Hi,

    danke für deinen Post. Ich denke so werde ich das wohl machen. Ich hätte erwartet das man das "einfacher" erledigen kann...

    Schaue mir deine anderen Posts dazu auch an.

    THX 👍


Anmelden zum Antworten