none
DataGridView KeyDown-Abfrage von Enter RRS feed

  • Frage

  • Guten Abend, 

    ich versuche, das Enter der Textbox nach der Editierung abzufangen, sodass er nicht direkt in die darunter liegende Zeile wechselt sondern in die rechts daneben. Habe mich auch schon in so manchen Foren darüber belesen, aber leider funktioniert das ganze nicht bei mir. Er zeigt mir nicht mal die Messagebox an, wenn ich Enter drücke. Aber dafür für alle Buchstaben, die ich drücke. Was mache ich falsch? 

    Code ist folgender:

    Form1.Designer.cs          

    this.GridView.EditingControlShowing += new System.Windows.Forms.DataGridViewEditingControlShowingEventHandler(GridView_EditingControlShowing);


    Form1.cs

    private void GridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (e.Control is DataGridViewTextBoxEditingControl) { (e.Control as DataGridViewTextBoxEditingControl).KeyDown += new KeyEventHandler(GV_KeyDown); } } private void GV_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { e.Handled = true; MessageBox.Show("."); } }

    Danke im Vorraus,


    • Bearbeitet Ctest1900 Dienstag, 5. November 2013 17:54
    Dienstag, 5. November 2013 17:53

Antworten

  • Hallo, fange vom EditingControl nicht das KeDown sondern das PreviewKeyDown-Event ab:
                (e.Control as DataGridViewTextBoxEditingControl).PreviewKeyDown += (sender2, e2) =>
                {
                    MessageBox.Show("");
                };
    Das wird ausgelöst. Jetzt musst du nur noch die aktuell markierte Zeile abspeichern und beim Zeilenwechsel wieder die letzte Zeile rückgängig machen.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Ctest1900 Dienstag, 5. November 2013 19:16
    Dienstag, 5. November 2013 18:02
    Moderator
  • Ich habe mal noch etwas herum probiert. Das event scheint sich immer nur hinzu zu abonnieren. D.h. es reicht das event am Anfang zu abonnieren. Hier mein funktionierender Code:

            bool isRegistred = false;
            private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                if (!isRegistred)
                {
                    isRegistred = true;
                    (e.Control as DataGridViewTextBoxEditingControl).PreviewKeyDown += (sender2, e2) =>
                    {
                        if (e2.KeyCode == Keys.Enter)
                        {
                            int col = dataGridView1.CurrentCell.ColumnIndex + 1;
                            int row = dataGridView1.CurrentCell.RowIndex;
                            if (col == dataGridView1.Columns.Count)
                            {
                                col = 0; row++;
                            }
                            dataGridView1.CurrentCell = dataGridView1.Rows[row].Cells[col];
                        }
                    };
                }
            }

    Somit wird das Event nur am Anfang registriert. Getestet unter .NET 4.5.

    Falls der Benutzer keine neuen Zeilen einfügen kann, muss noch der ermittelte row-Index geprüft werden. In meinem Test springt die markierte Zelle sind in die neue Zeile.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Ctest1900 Dienstag, 5. November 2013 19:53
    Dienstag, 5. November 2013 19:44
    Moderator

Alle Antworten

  • Hallo, fange vom EditingControl nicht das KeDown sondern das PreviewKeyDown-Event ab:
                (e.Control as DataGridViewTextBoxEditingControl).PreviewKeyDown += (sender2, e2) =>
                {
                    MessageBox.Show("");
                };
    Das wird ausgelöst. Jetzt musst du nur noch die aktuell markierte Zeile abspeichern und beim Zeilenwechsel wieder die letzte Zeile rückgängig machen.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Ctest1900 Dienstag, 5. November 2013 19:16
    Dienstag, 5. November 2013 18:02
    Moderator
  • Danke, das funktioniert! Und kannst du mir auch einen Hinweis geben, wie ich diese Zeile nun speichere?

    Grüße

    Dienstag, 5. November 2013 18:16
  • Habe es jetzt so gemacht wie du sagtest. Nur läuft das Event immer doppelt, auch wenn ich nur einmal enter drücke, und bringt meine Positionierung durcheinander. Ich hab versucht, das durch einen Flag zu vermeiden, aber das klappt nur bis zur dritten Zeile. Komisch.
    • Bearbeitet Ctest1900 Dienstag, 5. November 2013 19:05
    Dienstag, 5. November 2013 19:05
  • Ich habe mal noch etwas herum probiert. Das event scheint sich immer nur hinzu zu abonnieren. D.h. es reicht das event am Anfang zu abonnieren. Hier mein funktionierender Code:

            bool isRegistred = false;
            private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                if (!isRegistred)
                {
                    isRegistred = true;
                    (e.Control as DataGridViewTextBoxEditingControl).PreviewKeyDown += (sender2, e2) =>
                    {
                        if (e2.KeyCode == Keys.Enter)
                        {
                            int col = dataGridView1.CurrentCell.ColumnIndex + 1;
                            int row = dataGridView1.CurrentCell.RowIndex;
                            if (col == dataGridView1.Columns.Count)
                            {
                                col = 0; row++;
                            }
                            dataGridView1.CurrentCell = dataGridView1.Rows[row].Cells[col];
                        }
                    };
                }
            }

    Somit wird das Event nur am Anfang registriert. Getestet unter .NET 4.5.

    Falls der Benutzer keine neuen Zeilen einfügen kann, muss noch der ermittelte row-Index geprüft werden. In meinem Test springt die markierte Zelle sind in die neue Zeile.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Ctest1900 Dienstag, 5. November 2013 19:53
    Dienstag, 5. November 2013 19:44
    Moderator
  • Perfekte Lösung. Danke sehr, sehr hilfreich! Läuft rund!
    Dienstag, 5. November 2013 19:53