binding Source

15/12/2009 - 20:50 von Luxus Chris | Report spam
Hallo NG,

ich habe eine Frage zum Thema data set und binding source.

Ich binde in der Form_Load ein DataSet als DataSource und einen
DataTableName als DataMember einer BindingSource. Die BindingSource verwende
ich als DataSource einer DataGridView.

Nun speichere ich das DataSet in einer DB(ds_alt) und bekomme ein aktuelles
DataSet aus der DB zurück(ds_neu).
Nun sage ich ds_alt=ds_neu

Jetzt habe ich das Problem, dass :
1. ich rows mit dem rowstate =added doppelt in einer DataTable habe. Hier
weiß ich auch warum, nàmlich weil negative Werte für den PrimaryKey angelegt
werden. Beim Auslesen aus der DB habe ich jedoch positive Werte. Daher denkt
er es handelt sich um 2 verschiedene Datensàtze, da die Pks unterschiedlich
sind.
Ich habe also das alte DataSet nicht überschrieben mit dem Befehl. Wenn ich
ds.clear sage gehts nicht, v. weil es noch an BindingSources gebunden ist!?

2.Ich habe zwar die aktuellen Rows aus der DB in meiner DataTable des
DataSet, ich kann aber die BindingSources und die DataGridview nicht dazu
bringen diese Zeilen anzuzeigen. Die bindingsource.list.count =0 und in der
DGV wird nix angezeigt. ich habe probiert, BS.resumebinding,
resetdatabinding, ich habe datasource und datamember neu gesetzt, keinen
Erfolg.
Das einzige, was funktioniert hat ist bs.dispose:bs= new bindingSource und
dann alles neu zuweisen.

Gibt es keine Möglichkeit ein bestehendes DataSet zu überschreiben, sodass
die Datenbindungen bestehen bleiben? ds.merge ohne preserve hat auch nichts
gebracht...

Ich möchte also das alte dataset ds_old komplett ersetzen durch das dataset
ds_neu mit gleichem Schema, aber anderen Daten und brauche eine Möglichkeit,
wie meine BindingSources diese neue Datenquelle kapieren, also
Bs.list.count>0 ist.

Ich hoffe, ich habs einigermaßen klar ausgedückt...

danke
VG
Chris
 

Lesen sie die antworten

#1 Peter Götz
16/12/2009 - 08:51 | Warnen spam
Hallo Chris,

Ich binde in der Form_Load ein DataSet als DataSource
und einen DataTableName als DataMember einer BindingSource.



Ich rate mal, dass Du eine oder mehrere DataTables, welche
in einem DataSet liegen, mit Daten aus irgendeiner Datenbank
füllst.

Form_Load wàre dann nicht unbedingt der geeignetste
Zeitpunkt, da dies abhàngig von der Menge der zu ladenden
Daten die Anzeige der Form verzögern könnte. Verlege den
Ladevorgang evtl. nach Form_Shown(). Die Form wird dann
ohne unnötige Verzögerung sichtbar, der Benutzer sieht also
schon mal was bevor das Laden der Daten beginnt.

Die BindingSource verwende
ich als DataSource einer DataGridView.



Eigentlich nutzt Du eine DataTable in Verbindung mit
einer DataView als DataSource welche sich hinter
Deiner BindingSource verbergen. Eine BindingSource
kapselt Deine DataTable, eine DataView und einen
CurrencyManager, deren Funktionalitàt Du Dir mal
etwas genauer ansehen solltest um zu verstehen,
was diese Objekte für sich alleine oder eben
zusammengefasst in einer BindingSource tun.


Nun speichere ich das DataSet in einer DB(ds_alt) und
bekomme ein aktuelles DataSet aus der DB zurück(ds_neu).



Ich rate mal weiter, dass es in Deinem DataSet nur eine
einzige DataTable gibt. In diesem Fall wàre das DataSet
völlig überflüssig und reiner Ballast.

Wie sieht der Code, mit welchem Du die Daten aus
Deinem DataSet bzw. aus Deiner DataTable in die
entspr. DB-Tabelle übertràgst?

Mit welchem Code bekommst Du ein "aktuelles"
DataSet aus der DB zurück?
Und wozu ein neues, weiteres DataSet?


Nun sage ich ds_alt=ds_neu

Jetzt habe ich das Problem, dass :
1. ich rows mit dem rowstate =added doppelt in einer
DataTable habe.



Ohne Deinen relevanten Code zu kennen, ist nicht
nachvollziehbar, welche Daten sich nun in welchem
Deiner DataSets befinden.

Wenn Du Daten aus einer DB-Tabelle in eine
DataTalbe làdst, dann haben alle Rows dieser
DataTable erst mal den Status UnChanged.

Hier weiß ich auch warum, nàmlich weil negative Werte
für den PrimaryKey angelegt werden.
Beim Auslesen aus der DB habe ich jedoch positive Werte.



Das wàre dann der Fall, wenn Du beim Update der Daten
die Inhalte des Primàrschlüsselfeldes nicht mit zur DB
übertragen würdest und das entspr. Feld in der DB-Tabelle
eine Autowert-Feld ist.

Daher denkt er es handelt sich um 2 verschiedene Datensàtze,
da die Pks unterschiedlich sind.



Wenn Du Datensàtze mit den offenbar auf der Clientseite
vergebenen negativen IDs mit aus der DB-Tabelle kommenden
Datensàtzen mit positiven IDs in einer DataTable zusammenführst,
dann hast Du in der Tat doppelte Datensàtze. Jeden dieser
Datensàtze mal mit negativer ID und mal mit positiver ID.


Ich habe also das alte DataSet nicht überschrieben mit dem Befehl.



Mit welchem Befehl (Code)?

Wenn ich ds.clear sage gehts nicht, v. weil es noch an
BindingSources gebunden ist!?



s.oben:
Du solltest erst mal verstanden haben, was ein DataSet
ist und wozu es dient und ebenfalls solltest Du die Arbeitsweise
der in einer BindingSource gekapselten grundlegenden
Objekte (DataTable, DataView, CurrencyManager) kennen
und verstanden haben.

2.Ich habe zwar die aktuellen Rows aus der DB in meiner
DataTable des DataSet, ich kann aber die BindingSources
und die DataGridview nicht dazu bringen diese Zeilen
anzuzeigen.
Die bindingsource.list.count =0



Das bedeutet, dass die in BindingSource gekapselte
DataView resp. die dahinter liegende DataTable keine
Datensàtze enthàlt.

und in der DGV wird nix angezeigt.



Wenn die Datenquelle (DataSource) des DGV keine
Datensàtze enthàlt, dann kann das DGV eben auch
nichts anzeigen.


ich habe probiert, BS.resumebinding,
resetdatabinding, ich habe datasource und datamember
neu gesetzt, keinen Erfolg. Das einzige, was funktioniert
hat ist bs.dispose:bs= new bindingSource und
dann alles neu zuweisen.



Ich vermute, dass Du mit dem Designer irgendwas
zusammengeklickt hast, ohne zu wissen, was der
dabei vom Designer autom. generierte Code macht.
Er macht offenbar nicht das, was Du erwartest und hast
nun das Problem, nicht zu wissen, was Du an diesem
autom. generierten Code àndern müsstest.

Gibt es keine Möglichkeit ein bestehendes DataSet zu
überschreiben, sodass die Datenbindungen bestehen
bleiben? ds.merge ohne preserve hat auch nichts
gebracht...



Erst mal solltest Du überlegen, ob für Deinen Fall ein
DataSet überhaupt notwendig und sinnvoll ist. Wenn es,
wie ich vermute nur eine einzige DataTable enthàlt, ist
es vollkommen überflüssig. Ein DataSet brauchst Du
beispielsweise, wenn Du Inhalte mehrerer DataTables
in logische Beziehungen zueinander setzen willst, wie
z.B. bei Master-Detail-Darstellungen von Datensàtzen
aus verschiedenen in Beziehung stehenden Tabellen
resp. DataTables.


Blind im Nebel herumzustochern, wird Dich nicht
weiterbringen. Ich empfehle Dir, Dich erst mal mit der
Arbeitsweise der grundlegenden Objekte DataSet,.
DataTable, DataView, CurrencyManager sowie
DataAdapter und DataReader vertraut zu machen.

Unter

www.gssg.de -> Visual Basic -> VB.net
-> Datenbank
-> DataGridView
-> DataTable / DataView / CurrencyManager

findest Du eine Reihe von Beispielen, welche die
Funktionalitàt der o.g. grundlegenden Datenobjekte
demonstrieren und erklàren.

Ich möchte also das alte dataset ds_old komplett
ersetzen durch das dataset ds_neu mit gleichem
Schema, aber anderen Daten und brauche eine
Möglichkeit, wie meine BindingSources diese
neue Datenquelle kapieren, also Bs.list.count>0 ist.



Du hast, soweit ich es vertstanden habe, ein DataSet
mit einer einzigen DataTable. Die in dieser DataTable
enhaltenen Daten möchtest Du in einem DataGridView
anzeigen. Dafür brauchst Du erst mal weder ein
DataSet noch eine BindingSource.

Dim DT As DataTable
' DT mit Daten aus DB füllen via DataAdapter,
' oder DataReader oder aus sonstigen Quellen,
' bzw. via Code.

Dim DV as DataView

DV = New DataView(DT)
DataGridView.DataSource = DV

und schon siehst Du die in der DataTable DT
enthaltenen Daten in Deinem DataGridView.


Ich hoffe, ich habs einigermaßen klar ausgedückt...



Na ja, klar ist was anderes.
Ist aber verstàndlich vor dem Hintergrund, dass Du
offenbar (noch) nicht weisst, was Dein vom Designer
automatisch generierter Code überhaut macht, bzw.
wie Code aussehen müsste, der das von Dir Erwartete
macht.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen