vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Jeden Datensatz eines DataGridViews durchlaufen und ändern 
Autor: Volker Bunge
Datum: 02.01.19 11:47

Hallo zusammen,

so langsam nerven mich die für mich nicht mehr logischen Probleme.

Folgendes: In einem datengebundenen DGV kann ich mit

 For Each Row As DataGridViewRow In DGridViewAlleDateien.Rows
            Row.Cells(0).Value = Format(My.Settings.Playlist_Reihenfolge, _
              "00000000")
        Next
alle angezeigten Datensätze ändern.

Wenn ich aber nun über einen anderen Button mit

 For Each Row As DataGridViewRow In DGridViewAlleDateien.Rows
            Row.Cells(0).Value = ""
        Next
funktioniert dies nur bei jedem zweiten Datensatz.

Gut habe ich gedacht, dann machste das halt über eine andere For-to-Next Schleife

   Dim DGZeile As Integer
 
       For DGZeile = 0 To DGridViewAlleDateien.RowCount - 1
            DGridViewAlleDateien.Item(0, DGZeile).Value = ""
       Next DGZeile
funktioniert es auch nicht.

Was ich halt nicht verstehe, warum klappt es bei der Wertezuweisung und bei der Löschung der Werte nicht bei allen sondern immer nur bei jedem zweiten?

Info: Das Datenfeld ist ein Stringfeld

Wäre über jede Hilfe dankbar.

Volker
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Jeden Datensatz eines DataGridViews durchlaufen und ändern 
Autor: Manfred X
Datum: 02.01.19 15:27

Hallo!

Du mußt Dir darüber klar werden, daß jede Veränderung von
Zellwerten in einem Datagridview-Control Ereignisse auslöst.
Wenn Du also entsprechende Ereignisverarbeitungsroutinen
für dieses Grid programmiert hast, wird deren Code stets
ebenfalls ausgeführt.
Das ist meiner Vermutung nach der Grund für "unerwartete Resultate".

Unterbreche die Datenbindung in der Bindingsource und ändere
dann die Werte direkt in der Datenquelle (Datatable).
Dann stelle die Bindung wieder her.
Auf diese Weise kommt es nicht zur Ereignisauslösung.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Jeden Datensatz eines DataGridViews durchlaufen und ändern 
Autor: Volker Bunge
Datum: 02.01.19 17:45

Hallo Manfred X,

habe gerade mal was getestet.

Vor jeder Sub und Funktion habe ich einen Haltepunkt gesetzt. Sobald ich in der Schleife bin, werden keine weiteren Sub/Funktionen aufgerufen. Daher würde ich jetzt vermuten, dass es eine "Zweite" Aktion gibt, die mir ins Essen spuckt.

Was ich ja oben schon beschrieben habe, dass setzen des Wertes klappt, nur das zurücksetzen nicht.

Habe jetzt mal folgendes getestet

        ' unterbricht kurz die Datenverbindung, so dass die Playlisteinträge 
        ' gelöscht werden können
        DateienBindingSource.SuspendBinding()
 
        For Each Row As DataGridViewRow In DGridViewAlleDateien.Rows
            Row.Cells(0).Value = "00000000"
        Next
 
        ' Stellt die Verbindung wieder her
        DateienBindingSource.ResumeBinding()
(hoffe, dass Du dass mit trennen und wieder herstellen gemeint hast, wenn nicht, dann müsstest Du mir da mal den passenden Code kurz geben)

Leider funktioniert dies auch nicht. Wieder nur die Hälfte geändert. Ach so, die Befehle, also das dauerhafte speichern und so weiter funktionieren nach ResumeBinding.

Gruß
Volker
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Jeden Datensatz eines DataGridViews durchlaufen und ändern 
Autor: Manfred X
Datum: 02.01.19 18:01

Hallo!

Das Unterbrechen/Wiederherstellen der Datenbindung ist so richtig,
aber du operierst in der Schleife immer noch in den Datagridview-Zellen.
Das schleifenweise Editieren im Grid setzt eventuell auch den
Zeilenindex hoch (Cursor wandert in die nächste Zeile).

Du mußt deshalb die Werte direkt in der zugrundeliegenden Datatable ändern.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Jeden Datensatz eines DataGridViews durchlaufen und ändern 
Autor: effeff
Datum: 03.01.19 11:17

a) Hast Du Dein DataGridView sortiert, so dass nach einer Änderung einer Zelle die Reihenfolge geändert wird und deswegen mit einem völlig anderen Feld weiter gemacht wird?

b) Dein DataGridView ist datengebunden! Ändere die Werte in der DataTable und nicht im DataGridView!

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Jeden Datensatz eines DataGridViews durchlaufen und ändern 
Autor: Volker Bunge
Datum: 03.01.19 12:10

Hallo zusammen,

ich bin jetzt bald am verzweifeln.

Ich bekomme es einfach nicht hin, die gefilterten DataGridView Datensätze in die DataTable einzufügen.
Habe jetzt schon Stunden im Internet oder in 2 dicken Büchern gelesen, aber nicht das passende gefunden. Auch hier auf der Seite gerade noch einmal durchsucht, nichts.


Was ich glaube bisher verstanden habe (einfach ausgedrückt):

Eine DataTable ist eine "virtuelle", also nur im Arbeitsspeicher befindliche Tabelle, die ich entweder manuell über .Add mit Daten füllen kann, oder halt mit bestehenden aus einem DGV. Daten irgendwie bearbeitenm und das Ergebnis kann ich dann einem datengebundenen DGV per BindingSource = DT wieder übergeben und dauerhaft in der Datenbank abspeichern.

Was ich aber leider überhaupt nicht gefunden habe, wie ich der DataTable den aktuellen DGV Inhalt übergeben kann.

Mit
  ' Durchläuft alle Datensätze der Tabelle Dateien, keine Filterung
For Each row As DataRow In Musikdatenbank_DataSet.Dateien.Rows 
    row("Playlist") = "00000000"
Next
klappt das zwar, dauert aber beim Updaten sehr lange (sind ja auch insgesamt einige tausend Datensätze).

Bitte helft mir doch mal kurz auf die Sprünge, wie ich der DataTable den aktuellen DGV Inhalt übergeben kann.

Vielen Dank

Volker
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Jeden Datensatz eines DataGridViews durchlaufen und ändern 
Autor: Manfred X
Datum: 03.01.19 13:34

Hallo!

Du gehst von völlig falschen Vorstellungen aus.
Die Daten werden aus der Datenbank in ein Dataset geladen.
Das Dataset umfaßt, je nach dem Fill-Befehl ein oder
mehrere Datatable-Instanzen.
Dort werden die Daten aufbewahrt.

Das gebundene Datagridview enthält keine Daten, sondern erledigt
nur die Benutzer-Interaktion. Eingaben des Benutzers in das Grid
werden weitergereicht per Bindingsource an die Datatable.
Je nachdem wie programmiert worden ist, wird das Grid oder die Binding-
source dabei aktiv (Formatieren, Validieren, Filtern, Sortieren usw.)

Wenn Du per Code Daten in der Tabelle ändern willst, erledige das in
der Datatable und schalte sicherheitshalber die Datenbindung vorübergehend ab.
Dann reagieren Bindingsource und Datagridview nicht auf jede der
Daten-Änderungen.

Gefilterte Datensätze sind eine Auswahl der Datensätz, die bereits in
der Datatable stehen.
(Du mußt nie Daten aus dem gebundenen Grid an die Datatable übergeben.
Das erledigt die Datenbindung - falls es sich um Dialogeingaben des Users handelt.
Per Code werden im Grid keine Daten geändert, nur in der Datatable.)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Jeden Datensatz eines DataGridViews durchlaufen und ändern 
Autor: minimalist
Datum: 03.01.19 15:17

Schaue dir doch mal dieses beispiel an. Das hilft vielleicht weiter.
https://stackoverflow.com/questions/11379615/datagridview-save-changes-to-database-vb-net
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Jeden Datensatz eines DataGridViews durchlaufen und ändern 
Autor: Volker Bunge
Datum: 06.01.19 11:17

Hallo Manfred X, Hallo minimalist,

sorry, dass ich mich erst melde.

So, mein Problem habe ich nun hinbekommen, und zwar wie folgt

        ' Nun die Playlisteinträge löschen
        ' *********************************************************************
        ' ********************************
        ' Durchläuft alle Datensätze der Tabelle Dateien, mit Filterung bzw. 
        ' Bedingung
        Dim DatensatzZähler As Integer
        DatensatzZähler = -1
        For Each row As DataRow In Musikdatenbank_DataSet.Dateien.Rows
            If BackgroundWorker1.CancellationPending = True Then
                e.Cancel = True
                Exit For
            Else
                If row("Playlist") <> "00000000" And row("Dateityp") = "mp3" Then
                    row("Playlist") = "00000000"
 
                    ' Do heavy Work
                    DatensatzZähler = DatensatzZähler + 1
                    DoHeavyWork()
                    BackgroundWorker1.ReportProgress(DatensatzZähler)
                End If
            End If
        Next
        ' *********************************************************************
        ' ********************************
Nicht wunder, dass ganze läuft jetzt als Backgroundworker, damit mit diesem die Progressbar mit den Fortschritt anzeigt.

Vielen Dank noch einmal für die Unterstützung.

Volker
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel