Laden...

DataGridView KeyDownEvent von der Down Taste im Edit Modus einer Zelle

Erstellt von Falk82 vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.604 Views
F
Falk82 Themenstarter:in
7 Beiträge seit 2013
vor 10 Jahren
DataGridView KeyDownEvent von der Down Taste im Edit Modus einer Zelle

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.

49.485 Beiträge seit 2005
vor 10 Jahren

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

F
Falk82 Themenstarter:in
7 Beiträge seit 2013
vor 10 Jahren

Hallo herbivore

ja er geht ins PreviewKeyDown.

F
Falk82 Themenstarter:in
7 Beiträge seit 2013
vor 10 Jahren

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

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo Falk82,

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

herbivore

F
Falk82 Themenstarter:in
7 Beiträge seit 2013
vor 10 Jahren

Hallo herbivore,

auf MSDN Control.PreviewKeyDown-Ereignis steht folgendes

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

4.931 Beiträge seit 2008
vor 10 Jahren

Hallo Falk82,

hast du den Fehler bei deinem ersten Code schon bemerkt?


e.Control.KeyUp +=new KeyEventHandler(DataGridView_KeyDown);

KeyUp -> KeyDown 😉

49.485 Beiträge seit 2005
vor 10 Jahren

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

J
251 Beiträge seit 2012
vor 10 Jahren

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.

J
251 Beiträge seit 2012
vor 10 Jahren

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.