DataGridView Berechnung

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von FantaZimt.

    DataGridView Berechnung

    Ich hätte mal eine Frage. Ich habe ein DataGridView, dass per DataSet gefüllt wird. Nun möchte ich wie auf dem Bild zu sehen:


    die Werte berechnen. Und zwar möchte ich, dass in der Spalte "Erfahrung" die 600 - 500 gerechnet wird und dann das Ergebnis in die Spalte Erfahrung + eingetragen wird. Anschließend soll die 800 - 600 gerechnet werden und ebenfalls in die Spalte Erfahrung + eingetragen werden und eben immer so weiter bis eben alle Werte ausgerechnet wurden.

    Allerdings habe ich keine Ahnung, wie ich das mit dem DataGridView mache, da ich es zum ersten mal verwende.. Ich hoffe Ihr könnt mir ein wenig helfen. ^^
    du kannst doch auch die rows in der tabelle durchgehen und die entsprechenden werte addieren um sie dann in der betroffenen zeile einzutragen.

    natürlich wissen wir nun nicht was die bedingungen hierfür sind bzw. was die rows auszeichnet die addiert werden sollen.

    VB.NET-Quellcode

    1. dim zahl as integer
    2. for each rw as ds.tablerow in ds.table.rows
    3. 'prüfen ob die zeile betroffen ist und wert addieren
    4. if rw.? = ??? then
    5. zahl += rw.____
    6. end if
    7. next
    Gruß Hannes

    hans im glück schrieb:

    natürlich wissen wir nun nicht was die bedingungen hierfür sind bzw. was die rows auszeichnet die addiert werden sollen.


    es soll lediglich in der Spalte Erfahrung immer das gleich gemacht werden, nämlich:

    Wert2 - Wert1 = Ergebnis -> Ergebnis soll eben in einer neuen Splate ausgegeben werden, damit ich sehe wie viel ich "verdient" habe
    Wert3 - Wert2 = Ergebnis
    Wert4 - Wert3 = Ergebnis

    Die Zahlen werden von einem Online-Spiel ausgelesen und ich möchte ausrechnen wie viel Erfahrung usw. ich pro Tag gemacht habe.

    Chrigu666 schrieb:


    So, ich hab jetzt wieder ein bisschen Zeit gefunden.

    Ich hab mir das ganze eben nochmal angeschaut, allerdings weiß ich nicht wie ich in der Expression die Row davor anspreche...
    Beispiel:

    (Row vor der aktuellen) Uridium- (aktuelle Row) Uridum

    Ist das verständlich ausgedrückt?^^

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FantaZimt“ ()

    jo, das geht auch nicht.
    DataExpressions können die eigene Zeile oder mit ihr per DataRelation verknüpfte Zeilen addressieren. Ein Wert aus einer Zeile eins zuvor ist nicht addressierbar, und kann daher in die Berechnung nicht einfließen.
    Als Anfänger kommst du wohl am einfachsten zu einem Ergebnis, wenn du einen Timer nimmst, und die Spalte mw. alle 500ms neu durchrechnen lässt.
    Dabei aber nur Änderungen eintragen, wenn sich was geändert hat.

    Anspruchsvoller wäre, das DataTable.ColumnChanged-Event zu verarbeiten, und da zu reagieren. Da muss man aber auch auf Zufügungen/Löschungen von Datensätzen reagieren, das wird ziemlich frickelig.

    ErfinderDesRades schrieb:

    Da muss man aber auch auf Zufügungen/Löschungen von Datensätzen reagieren, das wird ziemlich frickelig.


    egtl. dürfte es doch nicht zu frickelig werden wenn er immer die letzte row nimmt und mit der davor berechnet?

    und dann ist es doch egal ob gelöscht oder geändert wurde? oder hab ich einen denkfehler?

    er müsste ja nur prüfen ob wenigstens 2 datensätze vorliegen, sonst gibts ja nichts zu rechnen.
    Gruß Hannes
    Lässt du dir im DGV immer alle Datensätze anzeigen?

    Jede Zeile besteht aus Column und Row
    Wenn sich der Aufbau deiner Tabelle nicht ändern sollte, und immer nur neue Zeilen hinzugefügt werden und das ganze ordentlich sortiert ist, kannst du über ggf. per Column- Und Row-Index darauf zugreifen.

    Sprich fürs Verstädnis:

    "Erfahrung+" hat als
    Column-Index = x
    Row-Index = y

    demnach stehen deine Werte für die "Erfahrung+" einmal in
    Column-Index = x-1
    Row-Index = y

    und

    Column-Index = x-1
    Row-Index = y-1

    Das kannst du gezielt oder per Schleife durchs ganze DGV machen, deine Erfahrung+ berechnen und unter Umständen auch Berechnungen ausschließen.

    Mit freundlichen Grüßen
    Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Besser wäre, du würdest die Daten aus der Tabelle nehmen (also aus der DataTable, nicht aussm DataGridView), berechnen und wieder hintun.
    Am besten auf typisierte Art - wie etwa hier (vergleichsweise beiläufig) gezeigt:
    Daten laden und speichern

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Je nachdem, wie du überhaupt die Daten in dein DataGridView hineinbekommst, kannst du auch so vorgehen:
    Du kapselst jede Zeile in eine Klasse, packst die dann in eine IEnumerable(Of DeineKlasse) und kannst dann alle 500ms eine Berechnung laufen lassen, in der du dir, wie bereits @FantaZimt gesagt hat: nächste Zeile - aktuelle Zeile.
    Das Auswählen der nächsten Zeile, kannst du lösen, in dem du dir eine Methode (für Fortgeschrittene auch eine Extension) baust, die zum einen die Liste von deinen Zeilen Klassen und zum anderen ein Objekt deiner Zeilenklasse entgegen nimmt. Dann brauchst du nur noch die Liste nach dem übergebenen Objekt durchsuchen, Index dir holen und das Element an Position Index +1 zurück geben.
    Um deine Berechnerei durchzuführen: Den Erfahrungswert auf nächsteZeile.Erfahrung - aktuelleZeile.Erfahrung setzten. Wenn du dann mit allen Zeilen durch bist, für das DataGridView die DataSource auf die Liste setzen, danach sind die Elemente bzw. die Anzeige aktuell.

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell