Autor Beitrag
tomycat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: 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 user profile iconChristian S.: Topic aus Multimedia / Grafik verschoben am Mo 07.03.2016 um 21:58
Moderiert von user profile iconChristian S.: Info-Feld von "4.5 (Silverlight)" auf "4.5" geändert am Mo 07.03.2016 um 21:58
Moderiert von user profile iconTh69: Titel geändert (von "datagridview Enter abfangen...")
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: Di 08.03.16 21:04 
ok,
ausblenden 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());

                //  MessageBox.Show("yesssss");
            }
        }


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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

ausblenden 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)
    {    
        // TODO
    }
}


Zuletzt bearbeitet von Ralf Jansen am Mi 09.03.16 20:56, insgesamt 3-mal bearbeitet

Für diesen Beitrag haben gedankt: tomycat
tomycat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: Mi 09.03.16 13:36 
erstmal mega Respekt ---->>>>>> Ralf Jansen

Aber irgendwie kennt google/VS TextBoxt nicht ?!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: Mi 09.03.16 20:51 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:


ausblenden C#-Quelltext
1:
        ctrl.KeyPress += MeinLiebesKeyDown;					


Wird komplett rot unterstriechen, Keine überladung für "MeinLiebesKeyDown" stimmt mit dem Delegaten KeyPressEventhändler überein.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: Mi 09.03.16 21:56 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: 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.
ausblenden 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:
     //////// Initialisieren von Objekten...
       TextBox ctrl;
      //////// Initialisieren von Objekten Ende

     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; //////////////// ...muss wieder abgezogen werden.
            }
        }
tomycat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: So 13.03.16 18:25 
ausblenden volle Höhe 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:
    //////// Initialisieren von Objekten...
       TextBox ctrl;
      //////// Initialisieren von Objekten Ende

     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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden 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. :-(