Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
DataGridView KeyDownEvent von der Down Taste im Edit Modus einer Zelle
Falk82
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

DataGridView KeyDownEvent von der Down Taste im Edit Modus einer Zelle

beantworten | zitieren | melden

Hallo Ich habe ein Problem mit dem KeyDown Event.
Wenn ich in der DataGridView in eine Zelle im Bearbeitungsmodus bin bekomme ich den KeyDownEvent von der "Down Taste" nicht.

Ich habe folgendes ausprobiert:

private void dgv_pickUpAddress_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            e.Control.TextChanged += new EventHandler(SearchAddress);
            e.Control.PreviewKeyDown -= new PreviewKeyDownEventHandler(Control_PreviewKeyDown);
            e.Control.PreviewKeyDown += new PreviewKeyDownEventHandler(Control_PreviewKeyDown);
            e.Control.KeyUp += new KeyEventHandler(DataGridView_KeyDown);
            
            
        }

        void Control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            Console.WriteLine(e.KeyCode.ToString() + ": " + e.IsInputKey.ToString());
            switch (e.KeyCode)
            {
                case Keys.Down:
                    e.IsInputKey = true;
                    break;
            }
        }

        void DataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Down)
            {
                this.searchResultList.SelectNextRow();
            }
            else if (e.KeyCode == Keys.Up)
            {
                this.searchResultList.SelectPreviousRow();
            }
            else if (e.KeyCode == Keys.Enter)
            {

            }
        }
Wenn ich einen Haltepunkt in die Methode "DataGridView_KeyDown" setze hält das Programm an wenn ich irgend ein Buchstabe drücke aber wenn ich die "Down" Taste drücke passiert nichts.

Ich komme hier nicht weiter.
Ich bin für jede Hilfe dankbar.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Falk82,

geht er bei Keys.Down ins PreviewKeyDown?

Andere Möglichkeit könnte sein, Form.KeyPreview zu setzen und dann Form.PreviewKeyDown und Form.KeyDown zu verwenden.

herbivore
private Nachricht | Beiträge des Benutzers
Falk82
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

Hallo herbivore

ja er geht ins PreviewKeyDown.
private Nachricht | Beiträge des Benutzers
Falk82
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

Hallo herbivore,

ich habe Form.KeyPreview auf "true" gesetzt und Form.PreviewKeyDown und Form.KeyDown
implementiert aber die "Down" Taste kommt auch da nicht an.


private void OfficeNew0_ParentChanged(object sender, EventArgs e)
{
	Form form = this.dgv_pickUpAddress.FindForm();
	form.KeyPreview = true;
	form.KeyDown += new KeyEventHandler(form_KeyDown);
	form.PreviewKeyDown += new PreviewKeyDownEventHandler(form_PreviewKeyDown);
}

void form_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
	Console.WriteLine("form_PreviewKeyDown: " + sender.ToString() + " " + e.KeyCode.ToString());
}

void form_KeyDown(object sender, KeyEventArgs e)
{
	Console.WriteLine(sender.ToString() + " " + e.KeyCode.ToString());
	
}

Haben Sie noch eine Idee?

Vielen Dank
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Falk82,

wenn er bei Key.Down ins PreviewKeyDown geht, wo ist dann dein Problem? Mach die gewünschte Behandlung doch dort.

herbivore
private Nachricht | Beiträge des Benutzers
Falk82
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

Hallo herbivore,

auf MSDN Control.PreviewKeyDown-Ereignis steht folgendes
Zitat
Sie sollten dem PreviewKeyDown-Ereignishandler keine Logik hinzufügen. Es sollte nur die IsInputKey-Eigenschaft festgelegt werden. Stattdessen sollten Sie die Logik in den KeyDown-Ereignishandler setzen.

des halb wollte ich im PreviewKeyDown keine Logik hinzufügen.

Falk82
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.432

beantworten | zitieren | melden

Hallo Falk82,

hast du den Fehler bei deinem ersten Code schon bemerkt?


e.Control.KeyUp +=new KeyEventHandler(DataGridView_KeyDown);
KeyUp -> KeyDown ;-)
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Falk82,

ok, mein Fehler. Das hatte ich nicht auf dem Schirm.

Allerdings ist das insgesamt irgendwie etwas blöd realisiert. Es fehlt eigentlich sowas wie PreviewKeyDownEventArgs.Ignore oder Cancel. Wenn man für eine Navigationstaste eine andere Behandlung als die Standard.Behandlung haben will, bleibt einem nur zu sagen, hey, das ist gar keine Navigationstaste, wodurch die Standardbehandlung der Navigationstaste nicht ausgeführt wird, aber die Taste leider eben auch wie eine normale Eingabe ans KeyDown weitergeleitet wird. Dort muss man dann aber wieder sagen, hey, das ist gar keine normale Eingabetaste, damit die normale Behandlung für Eingabetasten verhindert wird, denn die Taste soll ja doch eine Navigationstaste sein, nur eben mit einer anderen (Navigations-)Behandlung, die man jetzt im KeysDown ausführen muss, wo sie im Grunde gar nicht hingehört, denn die Standard-Navigationsbehandlung wird auch nicht dort durchgeführt.

Jetzt weiß du auch, warum die Behandlung laut Doku im KeyDown erfolgen soll, eben weil man dort verhindern muss, dass die Taste als normale Eingabe behandelt wird. Wenn aber wie in deinem Fall die Taste dort tatsächlich nicht ankommt(*), und sie auch sonst keine störenden Effekte verursacht, dann würde ich die Behandlung eben doch im PreviewKeyDown durchführen.

herbivore

(*) also trotz des Hinweises von Th69 nicht
private Nachricht | Beiträge des Benutzers
Jamikus
myCSharp.de - Member



Dabei seit:
Beiträge: 247
Herkunft: NRW

beantworten | zitieren | melden

Hey,

Der KeyDown-Event des DataGridViews bezieht sich nicht direkt auf eine Zelle, die sich im EditMode befindet, d.h. sobald man eine Zelle bearbeitet, wird nicht das KeyDown-Event geworfen vom DataGridView.

Vllt. hilft folgender Link weiter: DataGridView KeyDown?

In der vorgeschlagenen Lösung wird das KeyDown-Event des DataGridViews dann ausgelöst, wenn man in einer Zelle, die man bearbeitet, die Enter-Taste drückt.(*)

Dies kann man entsprechend erweitern, wenn man dies möchte.

(*) wohl zu hastig gewesen, Sry, Nach diesem Link wird das KeyUp-Event ausgelöst und bewirkt das verlassen des EditMode. Vllt. hat es aber dennoch Grundmarterial zur Modifizierung für das gewünschte Verhalten.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Jamikus am .
private Nachricht | Beiträge des Benutzers
Jamikus
myCSharp.de - Member



Dabei seit:
Beiträge: 247
Herkunft: NRW

beantworten | zitieren | melden

Eine etwas unschönere Methode (find ich zumindest) ist es den EditMode = EditProgrammatically zu setzen. Dadurch wird das KeyDown-Event ausgelöst, weil man bei einer Eingabe nicht mehr im Bearbeitungsmodus landet. (Hab dies testweise mit paar Keys getestet).

Man muss also theo. die gewünschte Zelle nur noch ermitteln für die Eingabe und die Zelle den wunsch entsprechend füllen.
private Nachricht | Beiträge des Benutzers