Entwickler-Ecke
WinForms - DataGridView Enter abfangen...
tomycat - So 06.03.16 22:29
Titel: DataGridView Enter abfangen...
hallo,
ich beschäftige mich gerade mit datagridview.
Das gerüst hat 8 Spalten.
wenn ich in Spalte 2 bin und Enter drücke soll die Funktion Spalte_zweite_enter.
Moderiert von
Christian S.: Topic aus Multimedia / Grafik verschoben am Mo 07.03.2016 um 21:58
Moderiert von
Christian S.: Info-Feld von "4.5 (Silverlight)" auf "4.5" geändert am Mo 07.03.2016 um 21:58
Moderiert von
Th69: Titel geändert (von "datagridview Enter abfangen...")
Ralf Jansen - So 06.03.16 22:35
In Silverlight gab es glaube ich kein DataGridView. Wovon sprichst du?
tomycat - Mo 07.03.16 22:55
hhhmmmmmmmm ?!?! Ich habe einfach mit vs 2015 das dataGridView in meine Form1.cs[Entwurf] reingezogen
Ein Button erstellt und folgendem Inhalt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| DataGridViewRow rowGrid = new DataGridViewRow(); rowGrid.CreateCells(dataGridView1); rowGrid.Cells[0].Value = "DeinWertZumBefüllen>"; rowGrid.Cells[1].Value = "DeinWertZumBefüllen>"; rowGrid.Cells[2].Value = "DeinWertZumBefüllen>"; rowGrid.Cells[3].Value = "DeinWertZumBefüllen>"; dataGridView1.Rows.Add(rowGrid); |
Wenn ich in Spalte 2 klicke möchte ich dass funktion blabla ausgeführt wird.
Ralf Jansen - Mo 07.03.16 23:11
Ich rate dann mal das du von Winforms sprichst.
In einem Grid einzelne Zellen zu füllen ist eher nicht der Weg den man gehen sollte. Grid sind wunderbar zum binden von Klassen geeignet. Also binde eine Liste einer von dir geschriebenen Klasse an das Grid. Die Properties der Klasse entsprechen dann den einzelnen Spalten.
Wie auch immer um eine Funktion auszuführen wenn in eine Zell geklickt wird gibt es denn
DataGridView.CellClick [
https://msdn.microsoft.com/de-de/library/system.windows.forms.datagridview.cellclick(v=vs.110).aspx] Event. Dort bekommst du Row und Column Index in den EventArgs mitgeliefert um auszuwerten wohin genau geklickt wurde.
tomycat - Di 08.03.16 21:04
ok,
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| private void tabelle_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { Point p = dataGridView1.PointToClient(Cursor.Position); DataGridView.HitTestInfo hit = dataGridView1.HitTest(p.X, p.Y); MessageBox.Show("Geklickte Spalte: " + dataGridView1.Columns[hit.ColumnIndex].ToString() + "\nGeklickte Zeile: " + dataGridView1.Rows[hit.RowIndex].ToString());
} } |
Den Code habe ich eingebaut, dann habe ich dataGridView1 bzw keydown mit der Funktion von oben verbunden.
Blöd ist nur, wenn ich in eine Zelle z.B. 123 reinschreibe und dann Enter drücke, dann passiert nichts. Wenn ich NUR Enter drücke, dann wird der Code ausgeführt.
Ralf Jansen - Di 08.03.16 22:15
Wenn du eine Zelle editierst wird ein Editor in dieser Zelle angezeigt das Grid selbst bekommt von dem was da passiert nix bzw. fast nix mit. Du mußt dich an den angezeigten Editor hängen um von diesem was abzufangen. Du solltest dich aber vorher fragen ob das genau das ist was du willst der enter Key hat eine spezielle Bedeutung in Controls. In einem Grid üblicherweise das er das Editieren beendet und denn Focus auf die nächste Zelle setzt. Da sollte man nur eingreifen wenn man explizit was anderes braucht und man damit leben kann das man das erwartete Standardverhalten möglicherweise kaput macht.
Bevor der Editor geöffnet wird feuert das Grid den
EditingControlShowing [
https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.editingcontrolshowing(v=vs.100).aspx] Event. Dort hast du Zugriff auf das benutzte Editor Control. Angenommen das ist eine normale TextSpalte und es wird deshalb eine TextBox benutzt dann
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| private void meinLiebesDataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { TextBox ctrl = e.Control as TextBox; if(ctrl != null) ctrl.KeyDown += MeinLiebesKeyDown; }
private void MeinLiebesKeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { } } |
tomycat - Mi 09.03.16 13:36
erstmal mega Respekt ---->>>>>> Ralf Jansen
Aber irgendwie kennt google/VS TextBoxt nicht ?!
Ralf Jansen - Mi 09.03.16 14:57
Jupp da ist ein t zuviel in den Code gerutscht. Hab ich korrigiert.
tomycat - Mi 09.03.16 20:51
Ralf Jansen hat folgendes geschrieben : |
C#-Quelltext 1:
| ctrl.KeyPress += MeinLiebesKeyDown; | |
Wird komplett rot unterstriechen, Keine überladung für "MeinLiebesKeyDown" stimmt mit dem Delegaten KeyPressEventhändler überein.
Ralf Jansen - Mi 09.03.16 20:59
Und der nächste Fehler, Sorry :( Es solle natürlich KeyDown heißen und nicht KeyPress. Hab ich korrigiert.
Wenn ich drüber nachdenke. Sollten beide Fehler nicht so offensichtlich sein das du das selber korrigierst nachdem du die Idee was da passiert/passieren sollte verstanden hast?
tomycat - Mi 09.03.16 21:56
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { TextBox ctrl = e.Control as TextBox; if (ctrl != null) { ctrl.KeyDown += MeinLiebesKeyDown; } }
private void MeinLiebesKeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { MessageBox.Show("BORRRRRRRRRRR"); } } |
Alle Event´s herausgenommen, bis auf EditingControlShowing.
BORRRRRRRRRRRRR wird nicht angezeigt.
Ralf Jansen - Mi 09.03.16 22:57
:autsch: Ganz langsam nähern wir uns dem Ziel.
Wie ich sagte ist Enter/Return ein besonderer Key und wird schon anderweitig bearbeitet. Die Standard Key Events werden bei Enter gar nicht mehr gefeuert.
Ich hätte den Code einfach mal ausprobieren sollen und nicht einfach selbstherrlich glauben sollen "ich weiß ja wie es geht".
Folgendes habe ich aber ausprobiert (und zumindest bei mir gehts). Läuft im Prinzip darauf hinaus den PreviewKeyDown Event zu verwenden. Der wird ohne das wir größere Aktionen starten müßen auch für Enter/Return gefeuert.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { TextBox ctrl = e.Control as TextBox; if (ctrl != null) { ctrl.PreviewKeyDown += MeinLiebesKeyDown; } }
private void MeinLiebesKeyDown(object sender, PreviewKeyDownEventArgs e) { if (e.KeyCode == Keys.Return) { MessageBox.Show("BORRRRRRRRRRR"); } } |
tomycat - Do 10.03.16 20:44
In eine Zelle reingeklickt schreibtschreibt Enter und es kommt die Booorrrr Meldung.
Dann, in eine Zelle reingeklickt schreibtschreibt Enter und es kommt 2 MAL die Booorrrr Meldung.
Dann 3 mal dann 4 mal...
Die Endlösung. Ich denke es ist ok.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| TextBox ctrl; private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { ctrl = e.Control as TextBox; if (ctrl != null) { ctrl.PreviewKeyDown += MeinLiebesKeyDown; } }
private void MeinLiebesKeyDown(object sender, PreviewKeyDownEventArgs e) { if (e.KeyCode == Keys.Return) { MessageBox.Show("BORRRRRRRRRRR"); ctrl.PreviewKeyDown -= MeinLiebesKeyDown; } } |
tomycat - Sa 12.03.16 23:19
ok, noch eine kurze Frage:
Ich bekomme "Ein Ausnahmefehler des Typs "System.NullReferenceException" ist in myprog.exe aufgetreten."
In der funktion habe ich folgendes eingebaut und in Reihe Spalte 0 habe ich 1111 eingetragen.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| private void MeinLiebesKeyDown(object sender, PreviewKeyDownEventArgs e) { if (e.KeyCode == Keys.Return) { String strTemp = dataGridView1.Rows[0].Cells[0].Value.ToString(); MessageBox.Show(strTemp); } } |
Th69 - So 13.03.16 12:59
Eine NullReferenceException solltest du doch selber recht schnell per Debugger ermitteln können...
Dein Ansatz ist aber sowieso falsch: du greifst auf die DataGridView-Zelle zu, bevor der Text von der TexBox dort eingetragen wurde.
Du solltest den Text aus dem TextBox-Control (sender) auslesen.
tomycat - So 13.03.16 16:43
ohh Stimmt, du hast recht, habst jetzt anderst gelöst. :-)
Noch eine kleine Frage noch, ich schreibe etwas in die Zelle drücke Enter, drücke ein paar mal Tab, dann wieder Enter, dann bekomme ich:
System.ArgumentOutOfRangeException wurde nicht behandelt.
Message: Ein Ausnahmefehler des Typs "System.ArgumentOutOfRangeException" ist in mscorlib.dll aufgetreten.
Leider kann ich nicht Pauschal sagen was ich genau Eingebe, plötzlich kommt die Meldung.
Ralf Jansen - So 13.03.16 17:54
Der StackTrace zum Fehler könnte Hinweise geben. Auch sollte dir die ArgumentOutOfRangeException üblicherweise den Namen des Arguments gesagt haben.
Mit Code, Stacktrace und Argumentname könnten wir uns das vielleicht vorstellen was da passiert.
tomycat - So 13.03.16 18:25
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| TextBox ctrl; private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { ctrl = e.Control as TextBox; if (ctrl != null) { ctrl.PreviewKeyDown += MeinLiebesKeyDown; } } private void MeinLiebesKeyDown(object sender, PreviewKeyDownEventArgs e) { if (e.KeyCode == Keys.Return) {
ctrl.PreviewKeyDown -= MeinLiebesKeyDown;
Point p = dataGridView1.PointToClient(Cursor.Position); DataGridView.HitTestInfo hit = dataGridView1.HitTest(p.X, p.Y); MessageBox.Show("Geklickte Spalte: " + dataGridView1.Columns[hit.ColumnIndex].ToString() + "\nGeklickte Zeile: " + dataGridView1.Rows[hit.RowIndex].ToString()); for (int counter = 0; counter < (dataGridView1.Rows.Count); counter++) { dataGridView1.Rows[counter].Cells[0].Value = counter + 1; }
} } |
Die F2 Abfage habe ich hier rausgenommen ( wegen verwirrung ), der Fehler läst sich provozieren mit Tab, Enter und Zahlenengaben / Buchstaben.
http://tomycat.de/out.jpg
Das suche und poste ich nchträglich ->>> Stacktrace und Argumentname
Ralf Jansen - So 13.03.16 20:05
Vielleicht erklärst du uns auch was du genau vorhast.
Das du in einem Editor nochmal über das Grid und der Mausposotion rauszufinden versuchst über welcher Zelle den der Mauscursor ist (der muss ja nicht mal über dem Grid liegen) erscheint mir doch sehr ~wild~. Zu welcher Zelle der Editor gehört ist irgendwie eindeutig und wo sich die Maus bzw. der Mauscursor befindet ist völlig unabhängig davon welche Keyboard-Taste man den in einem Grid Editor gedrückt hat.
tomycat - So 13.03.16 20:53
hhhmmmm ok,
ich will so ein Mini mini Rechnung Porg. schreiben.
Das Drumherum ist so 98 % fertig.
Was ich noch möchte ist eine Idee Excel Tabelle in C#.
Die Spalten: Pos Code Artikelname Netto Steuer Brutto Menge Preis.
Ich befinde mich in Spalte Code und drücke zweimal F2 ( nach dem ersten mal drücken blinkt der Curser, beim zweiten mal öffnet sich Form4 für ein fix und fertige Text Blöcke. Die Entertaste soll dann später mal den Barcode aufnehmen und aus der SQL Datenbank den Barcode holen.
Das Grundproblem ist ArgumentOutOfRangeException. Problem 2 ist:
Ich baue den Code zusätzlich ein:
C#-Quelltext
1:
| MessageBox.Show(hit.RowIndex.ToString()); |
Dann befinde mich z.B. in Zeile 5 und drücke Enter, Die Messagebox bringt mir 4, das ist ok. von 10 mal herumspielen bekomme ich einmal 0 oder -1 obwohl ich z.B. in Zeile 3 bin. ääähhhhh ?!
Ich fühle mich so, als wäre ein leckeres Steak (Medium) und selbstgemachten Nudeln mit Jägersoße auf dem Tisch, nur leider finde ich kein Besteck. :-(
Ralf Jansen - Mo 14.03.16 00:50
Und warum machst du einen Hittest wo sich gerade die Maus befindet?
Und was interessiert dich der Wert der Zelle unter der Maus. Wo du gerade in einer voraussichtlich ganz anderen Zelle gerade einen Editor aufhast um den Inhalt dieser Zelle zu bearbeiten?
Und warum nennst du diese Zelle unter der Maus "geklickt". Dein Code wird ausgeführt wenn du im Editor return gedrückt hast. Du hast keine Maustaste gedrückt um da hin zu kommen.
Wenn du einfach wissen willst in welcher Zelle du dich zum editieren befindest dann befrag einfach die CurrentCell Property des Grids.
Gefühlt löst du dein Aufgabe auch an der völlig falschen Stelle und machst es dir damit schwer und bindest dich an ein spezielles Control und an das spezielle Verhalten dieses Controls.
Das du direkt versuchst Zellen des Grids zu ändern wenn irgendwo anders du einen Zellenwert geändert hast zeigt das du die Teilprobleme Anzeige von Daten und Logik bezüglich Daten nicht sauber trennst. Um das beherrschbar zu halten solltest du das aber unbedingt tun.
Es gibt die wunderbare Technik des Databinding die dich dabei unterstützt ein sauberes Modell der Daten(das dann die Logik enthält die du gerade ans Grid schraubst) zu erstellen und dieses einfach an das DataGridView zu binden.
tomycat - Mo 14.03.16 21:57
Das ist echt lieb von dir dass du mir so hilfst, mein Projekt hat schon über 5000 Zeilen c#. Aber das ist jetzt mir eine Nummer zu groß. Ich habe jetzt einen Idee wie ich zum Ziel komme, ein Klick auf Code und dann kommt meine Form4. Trotzdem vielen vielen Dank.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!