| |
VB.NET - Ein- und UmsteigerDatagridview wirft Nullreferenceexception bei Datatable-Binding | | | Autor: Soenke1492 | Datum: 06.02.15 21:23 |
| Guten Abend zusammen,
ich bin mal wieder am verzweifeln.
Ich habe ein Datagridview welches über einen Dataview beim Laden des Formulars an die in einem Dataset befindliche Datatable gebunden wird.
Es gibt jetzt im Programm mehrere Threads die Daten zu dieser Datatable hinzufügen und / oder löschen.
Die Zugriffe auf die Datatable habe ich über system.threading.monitor.tryenter und entsprechendes Exit abgesichert.
Zu nicht planbaren Zeitpunkten wirft das Datagridview leider eine Nullreferenceexception und ich habe keine MÖglichkeit diese abzufangen. Ich habe es bereits über dataerror versucht, aber die Exception wird nicht abgefangen.
Mach ich grundsätzlich etwas falsch? Im Normalfall wird das Datagridview laufend automatisch durch das Binding aktualisiert und es gibt keine Probleme. Aber zu beliebigen Zeiptunkten taucht die Exception auf und klickt man auf "Weiter", so wird der Datagridview weiß und mit einem roten Kreuz versehen.
Jemand einen heißen oder dem Wetter angepassten kalten Tipp?
Viele Grüße,
Sönke | |
Re: Datagridview wirft Nullreferenceexception bei Datatable-Binding | | | Autor: Manfred X | Datum: 06.02.15 21:37 |
| Setze während des Änderns eine Synclock-Sperre für die Datatable und unterbrich die Datenbindung.
| |
Re: Datagridview wirft Nullreferenceexception bei Datatable-Binding | | | Autor: Soenke1492 | Datum: 06.02.15 22:13 |
| Hallo Manfred,
meinst Du in etwa so?
dim lock as object
synclock lock
dgv.datasource = nothing
ds.tables("tabelle1").rows(3).delete
dim dv as new dataview
dv.datasource = ds.tables("tabelle1")
dgv.datasource = dv
end synclock Fängt das nicht brutal an zu flackern, wenn ich jedes Mal die Verbindung kappe? Muss ich das dann auch invoke lösen?
Viele Grüße,
Sönke | |
Re: Datagridview wirft Nullreferenceexception bei Datatable-Binding | | | Autor: Manfred X | Datum: 06.02.15 22:40 |
| Ich kenne Dein Datenbindunsszenario nicht.
Multithreading bedarf immer sorgfältiger Planung - insbesondere Threadkoordination und GUI-Zugriffe.
Mit dieser Methode kann zeitweise verhindert werden, daß Änderungen im Control direkt in die angebundene Quelle übertragen werden
(falls der Benutzer Daten-Änderungen vornehmen kann):
https://msdn.microsoft.com/de-de/library/system.windows.forms.currencymanager.suspendbinding%28v=vs.110%29.aspx
z.B. weil die gerade anderweitig aktualisiert wird.
Du mußt ggf. die Ereignisverarbeitungsroutinen des Grid prüfen, z.B. damit es nicht zu Zugriffen auf bereits aus dem
Hintergrund-Thread gelöschte Daten kommt. Setze dort Try-Catch-Blöcke ein, um herauszufinden, unter welcher Bedingung
die Ausnahme eintritt.
| |
Re: Datagridview wirft Nullreferenceexception bei Datatable-Binding | | | Autor: Soenke1492 | Datum: 06.02.15 23:07 |
| Also der Nutzer kann nichts ändern. Daran kann es nicht liegen.
Welche Ereignisse soll ich denn noch abfangen? Aktuell versuche ich das dataerror-ereignis zu catchen. Aber das ist es definitiv nicht.
Viele grüße,
Sönke | |
Re: Datagridview wirft Nullreferenceexception bei Datatable-Binding | | | Autor: Manfred X | Datum: 06.02.15 23:19 |
| Jede Änderung an der Datatable führt zu entsprechenden Benachrichtigungen an das
daran gebundene Control.
Du mußt alle im Programm vorhandenen Ereignisverarbeitungsroutinen für das Control
und für die Datatable als potentielle Orte, an denen die Ausnahme auftreten könnte,
in Betracht ziehen.
| |
Re: Datagridview wirft Nullreferenceexception bei Datatable-Binding | | | Autor: Soenke1492 | Datum: 07.02.15 08:19 |
| Hmmm... Ich verstehe Dich gerade nicht ganz.
Definitiv ist an jeder Stelle, wo Änderungen an der Datatable durchgeführt werden ein Try / Catch Block vorhanden. An diesen Stellen kann das Problem nicht auftreten.
Was meinst Du mit Ereignisverarbeitungsroutinen für das Control? Meinst Du damit alle Ereignisse wie "cellclick, cellwidthchanged" etc?
VG,
Sönke
| |
Re: Datagridview wirft Nullreferenceexception bei Datatable-Binding | | | Autor: Manfred X | Datum: 07.02.15 21:14 |
| Hallo!
Ich meine die Verarbeitungs-Routinen der Ereignisse, die Du erstellt hast.
Dabei geht es nicht nur um Änderungen an der Datenquelle.
Bei jedem "Refresh" des Datagrid, das nach Änderungen in der
Datenquelle durchgeführt wird, werden diverse Ereignisse (z.B. CellPaint)
gemeldet und ggf. die Handler ausgeführt.
Ich vermute, Du greifst dabei irgendwo auf einen bereits gelöschten
Zeilen-Index zu.
Beachte auch, daß die Zeilenindizierung in der Datenquelle (Table)
gewöhnlich nicht identisch ist mit der Grid-Indizierung, sondern
vom Dataview (Sort, Filter) organisiert wird.
Du darfst die Table nicht erst sperren, wenn Du innerhalb eines
Thread Änderungen einträgst, sondern bereits, wenn Werte abgefragt werden.
Beitrag wurde zuletzt am 07.02.15 um 21:19:06 editiert. | |
Re: Datagridview wirft Nullreferenceexception bei Datatable-Binding | | | Autor: Soenke1492 | Datum: 11.02.15 10:28 |
| Hallo Manfred,
danke für den Input.
Ich habe jetzt testweise wirklich für jedes Ereignis des Datagrids eine Sub erstellt und einen Try Catch Block reingesetzt.
Trotzdem kommt leider rudimentär der unabgefangene Fehler noch und das Datagrid steigt aus.
Any idea?
VG,
Sönke | |
Re: Datagridview wirft Nullreferenceexception bei Datatable-Binding | | | Autor: Manfred X | Datum: 11.02.15 18:14 |
| Wie sorgst Du dafür, daß die Anzeige im Grid
- nach Datensatz-Änderungen aus einem Thread -
aktualisiert wird.
Ich habe die Sache getestet (ReadOnly-DatagridView,
DataView-Bindung, massenhafte DataTable-Änderungen in Threads)
und dabei innerhalb (am Ende) des SyncLock-Blocks
per "Invoke" ein "Refresh" der Datatable ausgeführt.
Das klappt problemlos - auch dann, wenn die Grid-Zellen
per Code im "CellPaint"-Event gezeichnet werden.
(Du mußt nur die Grid-Events im Auge behalten, für die Du
Handler (Code) erstellt hast.)
Baue eventuell eine "zentrale Fehlerbehandlung" ein,
um herauszufinden, wo der Fehler auftritt (StackTrace).
http://www.vbarchiv.net/tipps/details.php?id=1571
Beitrag wurde zuletzt am 11.02.15 um 18:37:28 editiert. | |
Re: Datagridview wirft Nullreferenceexception bei Datatable-Binding | | | Autor: Soenke1492 | Datum: 21.02.15 15:14 |
| hallo Manfred,
Vielen Dank für deine Anstrengungen!
Dank Deiner Hilfe habe ich den Fehler jetzt mit umfangreichem Invoke aus allen Threads und Synclocks lösen können.
Die übergreifende Fehlerbehandlung kannte ich noch nicht und werde ich jetzt generell überall zur Sicherheit einbauen! Vielen Dank!
Viele Grüße,
Sönke
| |
| 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 |
|
|
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 InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|
|
|
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
|
|