none
Ergebis-Spalte im DataGridView RRS feed

  • Allgemeine Diskussion

  • Hallo,

    ich bin was Visual Basic angeht ein blutiger Anfänger, deshalb habe eine kleine Frage zum DataGridView.

    Ich habe in einer Form ein DataGridView mit verschiedenen Spalten.

    Davon sind manche TextBoxen, Comboboxen oder Checkboxen.

    Der Benutzer soll einer Zeile die Daten eingeben (Zahlen) und noch während er die Daten eintippt (hier fehlt mir das passende Event) sollen aufgrund der eingegeben Daten die letzten (rechten) Spalten unterschiedliche Ergebnisse berechnen (hier fehlt das Auslesen der Daten, die eingegeben werden und das Eintragen in die anderen Spalten der gleichen Zeile; rechnen kann ich schon ;))

    Hier kleines Beispiel:
    Länge |Breite |Stärke |Gewicht |Kosten
    100    |200    |150     |120       |80      
    Länge, Breite und Stärke sollen vom Benutzer eingegeben werden.
    Sowie die erste 1 bei Länge eingegeben wird, soll das Programm versuchen Gewicht und Kosten in der gleichen Zeile zu berechnen und dort einzutragen.
    Das heißt, dass Gewicht und Kosten immer live geupdated werden sollen.

    Sollte an der Frage noch was unklar sein, einfach nach fragen ;)

    Mit freundlichen Grüßen
    Crischi94

    Donnerstag, 19. September 2013 12:58

Alle Antworten

  • Soweit ich das im Kopf habe, übernimmt das Editieren der Werte nicht das DGV selbst, sondern ein EditingControl, das für jeden Spaltentyp natürlich ein anderes ist. Wenn du also etwas editierst, merkt das DGV selbst davon zunächst nichts. Erst wenn das EditingControl seine Arbeit beendet hat, wird das DGV validiert und dortige Ereignisse erzeugt.

    Du könntest nun (was doch etwas kompliziert ist, ich habe das vor einiger Zeit mal mit einer DataGridViewComboBoxColumn gemacht) einen eigenen ColumnTyp ableiten, der ein eigenes EditingControl hat (das du ebenfalls selbst ableitest), das nicht nur erst beim Beenden die Validierung bewirkt, sondern permanent. Damit stünden dir dann die gewünschten Ereignisse sicher zur Verfügung, die du dann in deiner Hauptform behandeln kannst, z. B. mit einer Aktualisierung in einer anderen Spalte.

    Ob das auch einfacher geht, wage ich im Moment mal zu bezweifeln.

    Eventuell kannst du auch bei Start-und End-Editing das jeweilige EditingControl herausfinden und einen Handler anhängen, der das KeyPress-/SelectionChange-/what-ever-Event abfängt, in dem du dann den Text des jeweiligen Controls erfasst und validierst. Das Problem hierbei dürfte jedoch sein, die Zeile herauszufinden, in der sich das Parent-Control im DGV befindet.


    LG, Dennis.

    EDI Consultant/Developer

    Ich nutze meistens VB6 und VS2005 bis VS2012

    Bitte die Antworten sowie weitere hilfreiche Beiträge von Mitgliedern markieren. Vielen Dank.

    Donnerstag, 19. September 2013 13:33
  • Doppel-Post zu vergleichbarer/gleicher Frage im parallelen C#-Forum?

    Siehe hier:

    http://social.msdn.microsoft.com/Forums/vstudio/de-DE/1cb0f484-8c33-4f28-9d36-5e488a016173/ergebisspalte-im-datagridview


    LG, Dennis.

    EDI Consultant/Developer

    Ich nutze meistens VB6 und VS2005 bis VS2012

    Bitte die Antworten sowie weitere hilfreiche Beiträge von Mitgliedern markieren. Vielen Dank.

    Donnerstag, 19. September 2013 13:37
  • Hallo Dennis,

    erst mal danke für deine schnelle Antwort ;)

    Ja, es stimmt, dass ich diese Frage auch im C#-Bereich gestellt habe, da ich gerne eine Lösung für beide Sprachen hätte.

    Ich befinde mich gerade in einer ITA (Informationstechnischer Assistent)-Ausbildung und absolviere gerade ein Praktikum. Für den Betrieb soll ich ein Programm schreiben in Visual Basic, kenne von der Schule aber nur C#. Deshalb würde es mich halt zusätzlich interessieren, wie die Lösung in C# aussehen würde. Visual Basic ist aber erst mal wichtiger.

    Also es würde im Prinzip auch reichen, wenn sich die Daten in den Ergebnis-Spalten updaten, wenn das Eintragen in eine Zelle abgeschlossen ist. Sprich die Berechnung wird nicht nach der ersten 1 bei der Länge durchgeführt, sondern wenn die 100 fertig geschrieben ist. Dies sollte allerdings letzter Zeitpunkt sein.

    Ich habe mal ein bisschen in der Liste der verfügbaren Events für das DGV nachgeschaut. Theoretisch könnten doch diese Events in Frage kommen, oder nicht?

    CellValueChanged-Event, CurrentCellChanged-Event, SelectionChanged-Event, CellEndEdit-Event, CellLeave-Event, CellValidated-Event, Leave-Event, RowLeave-Event, RowValidated-Event, Validated-Event, EditModeChanged-Event, oder CellStateChanged-Event

    Benutzt wird hier VS2012 bzw. VS2013

    Mit freundlichen Grüßen

    Crischi94

    Donnerstag, 19. September 2013 14:16
  • Hallo,
    ich denke mal, das Dennis noch die schönste Variante aufgezeigt hat.

    Ich habe noch eine etwas andere, aber eigentlich nicht so schöne, Lösung. Erstelle einen Timer, den du im CellBeginEdit-Event startest und beim CellEndEdit-Event wieder anhälst:

            private void timer1_Tick(object sender, EventArgs e)
            {
                dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);//Änderungen übernehmen
            }
            
            private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
            {
                timer1.Start();
            }
    
            private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
            {
                timer1.Stop();
            }
    
            private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                //Zur überprüfung
                if (dataGridView1.CurrentCell == null)
                    textBox1.Text = "";
                else
                    textBox1.Text = dataGridView1.CurrentCell.Value.ToString();
            }

    Im Tick-Event kannst du den Text aktualisieren. Der 2. Thread ist nicht wirklich die schönste Lösung. Auch aktualisiert sich das Value nicht immer sofort sondern spätestens nach dem Timer-Interval (Standart: 100ms).

    Ich habe deine 2 Fragen mal zusammengeführt. Eine Frage reicht vollkommen.


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Donnerstag, 19. September 2013 14:19
    Moderator
  • Also wenn dir das Validieren NACH dem Eingeben (und damit nach Beenden des EditingControls) ausreicht, dann nimm doch das CellEndEdit-Event. Damit haste es dann sicher relativ leicht und brauchst auch nichts ableiten.

    Wobei EndEdit dann - ums korrekt zu haben - nicht das Zuendeschreiben der 100 ist, sondern das Bestätigen dieser als Eingabe, und damit Übernahme dieser Zahl vom EditingControl in die eigentliche DGV-Zelle. Solange du im EditingMode bist, kannst du natürlich aus der 100 auch wieder eine 10 oder eine 200 machen.

    Analogie: Stell dir das funktional vor wie ein Label in einer Form, das, sobald du darauf klickst, eine InputBox aufgehen lässt, in der du einen Wert eingibst. Sobald du die InputBox mit OK beendest, gehts zurück in das Hauptprogramm, in dem du dann die Eingabe in das Label übergeben kannst. Solange die InputBox offen ist, ändert sich im Label nix, und du kannst alles noch ändern. Das EndEdit entspräche in etwa dem zurückgehen ins Hauptprogramm, also nach Drücken des OK-Buttons.

    Am Rande bemerkt ... "schön" in Zusammenhang mit DGVs ist IMHO sehr relativ. ;-)


    LG, Dennis.

    EDI Consultant/Developer

    Ich nutze meistens VB6 und VS2005 bis VS2012

    Bitte die Antworten sowie weitere hilfreiche Beiträge von Mitgliedern markieren. Vielen Dank.

    Donnerstag, 19. September 2013 14:38
  • Guten Morgen,

    Ok, demnach ist das nicht ganz so schön, aber ausreichend, wenn man die 100 eingegeben hat (und natürlich, das hatte ich schon verstanden, bestätigt hat, indem man die Zelle verlassen hat).

    Dann werde ich das also  in dieser Form anwenden. Trotzdem schöner Vergleich ;)

    "Am Rande bemerkt ... "schön" in Zusammenhang mit DGVs ist IMHO sehr relativ. ;-)"
    Mit diesem Satz kann ich leider gerade nicht so viel anfangen; was heißt das IMHO?

    Und dann geht es noch um das Auswerten der Eingabe an sich.
    Ich habe jetzt das CellEditEnd-Event genommen.

    Gehen wir jetzt davon aus der Benutzer hat die 100 bei der Länge eingetragen und hat auf die Breite-Zelle geklickt. Jetzt soll in der Gewicht- und Kosten-Zelle der jeweilige Wert berechnet werden (natürlich in der gleichen Zeile).

    Ist nicht bei allen drei Eingabe-Zellen ein Wert eingegeben, kann natürlich nichts sinnvolles dabei raus kommen, deshalb soll bei leeren Feldern von einer 0 ausgegangen werden (womit Gewicht und Kosten natürlich auch 0 lägen ;)), aber diese Abfrage sollte ich noch selbst hin bekommen. Vorausgesetzt ich weiß, wie ich Daten aus den Zellen lesen evtl. in Zahlenwerte umwandeln und nach der Berechnung in eine andere Zelle (gleiche Zeile) eintragen kann.

    Mit freundlichen Grüßen

    Crischi94

    Freitag, 20. September 2013 06:39
  • Guten Morgen,

    [...]

    Dann werde ich das also  in dieser Form anwenden. Trotzdem schöner Vergleich ;)

    "Am Rande bemerkt ... "schön" in Zusammenhang mit DGVs ist IMHO sehr relativ. ;-)"
    Mit diesem Satz kann ich leider gerade nicht so viel anfangen; was heißt das IMHO?

    DGV = DataGridView

    IMHO = ... meiner bescheidenen Meinung nach ...

    Strings in Zahlen konvertieren geht z.B. mit VAL oder je nach Zieltyp mit CINT oder CDBL etc. Die anderen Zellen ermitteln ist vielleicht etwas Detektivarbeit, aber auch machbar. Kriegst du sicher hin! Die 0 abfangen sollte man natürlich tun, da hast du recht, das könnte auch bei Divisionen zu unschönen Fehlern führen. ;-)


    LG, Dennis.

    EDI Consultant/Developer

    Ich nutze meistens VB6 und VS2005 bis VS2012

    Bitte die Antworten sowie weitere hilfreiche Beiträge von Mitgliedern markieren. Vielen Dank.

    Freitag, 20. September 2013 07:47
  • Hallo Dennis,

    ich denke, damit lässt sich erst mal arbeiten. Ich werde dann man ein bisschen rum klicken und probieren.

    Ich meine allzu schwer kann es ja bestimmt nicht sein eine Zelle auszulesen oder ihr einen Wert zuzuweisen.

    Kleine Frage am Rande:
    Bin neu hier im Forum, sieht so aus, als würde der letzte Teil deiner Antworten aus einer Signatur kommen.

    Ich habe mich jetzt schon halb tot gesucht, wo kann ich so eine Signatur erstellen?

    Vielen Dank,

    Mit freundlichen Grüßen

    Crischi94

    Freitag, 20. September 2013 11:03
  • Signatureinstellung gerade gefunden... ;)
    Sieht doch gut aus, oder? :p
    Freitag, 20. September 2013 11:09
  • Sauba! ;-)

    LG, Dennis.

    EDI Consultant/Developer

    Ich nutze meistens VB6 und VS2005 bis VS2012

    Bitte die Antworten sowie weitere hilfreiche Beiträge von Mitgliedern markieren. Vielen Dank.

    Freitag, 20. September 2013 14:20
  • Hi Crischi94,

                     

    Ist Deine Situation eigentlich abgeklärt ? Können wir den Thread schließen ? Wenn ja - bitte markiere die hilfreichen Beiträge "als Antwort".

     

    Viele Grüße,

    Ciprian


    Ciprian Bogdan, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.





    Montag, 23. September 2013 12:26
  • Hallo,

    so ganz ist die Sache mit dem DGV nicht abgeklärt. Es ist bei mir noch aktuell, habe aber auch zwischendurch immer wieder noch Anderes zu tun...
    Ich habe aber im Moment Urlaub, deshalb könnte sich das noch was raus ziehen.

    Soll der Thread dann noch so lange offen bleiben, oder soll ich dann einfach ggf. einen neuen Thread auf machen?

    Ist mir im Prinzip egal.

    Dienstag, 24. September 2013 07:57
  • Hi,

    Der Thread wird ggf. in ein Kommentar umgewandelt. 

    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.

    Danke,

    Ciprian

     


    Ciprian Bogdan, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.





    Dienstag, 24. September 2013 10:14