| |
VB.NET - Ein- und UmsteigerJeden 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 | |
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. | |
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 | |
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. | |
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 | |
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 | |
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.) | |
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 | |
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 | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevGraph (VB/VBA)
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere Infos
|