Autor |
Beitrag |
tomycat
      
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: So 06.03.16 22:29
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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: So 06.03.16 22:35
In Silverlight gab es glaube ich kein DataGridView. Wovon sprichst du?
Für diesen Beitrag haben gedankt: tomycat
|
|
tomycat 
      
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 Event. Dort bekommst du Row und Column Index in den EventArgs mitgeliefert um auszuwerten wohin genau geklickt wurde.
Für diesen Beitrag haben gedankt: tomycat
|
|
tomycat 
      
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 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) { } } |
Zuletzt bearbeitet von Ralf Jansen am Mi 09.03.16 20:56, insgesamt 3-mal bearbeitet
Für diesen Beitrag haben gedankt: tomycat
|
|
tomycat 
      
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: Mi 09.03.16 13:36
erstmal mega Respekt ---->>>>>> Ralf Jansen
Aber irgendwie kennt google/VS TextBoxt nicht ?!
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 09.03.16 14:57
Jupp da ist ein t zuviel in den Code gerutscht. Hab ich korrigiert.
Für diesen Beitrag haben gedankt: tomycat
|
|
tomycat 
      
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: Mi 09.03.16 20:51
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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?
Für diesen Beitrag haben gedankt: tomycat
|
|
tomycat 
      
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 09.03.16 22:57
 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"); } } |
Für diesen Beitrag haben gedankt: tomycat
|
|
tomycat 
      
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: 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
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: tomycat
|
|
tomycat 
      
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: So 13.03.16 18:25
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.
tomycat.de/out.jpg
Das suche und poste ich nchträglich ->>> Stacktrace und Argumentname
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: tomycat
|
|
tomycat 
      
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: 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. 
|
|