gleiche BindingSource in 2 Formularen verwenden

26/02/2008 - 16:16 von Matthias Bunge | Report spam
Hallo NG,

Kann mir vielleicht jemand folgendes Verhalten erklàren:

Ich habe 2 Forms.
Auf dem ersten befindet sich ein DataGridView welches
via BindingSource an einer Collection vom Typ ' IQueryable' hàngt
Dieses Grid dient nur zur Anzeige bzw. Vorfilterung von Datensàtzen.
Nach Auswahl eines Datensatzes gelangt man in das zweite Form,
auf welchem sich eine entprechende Anzahl von Textboxen, Checkboxen,
Comboboxen etc. befindet um diesen bearbeiten zu können.
Die nötigen Einstellungen für die Datenbindung beider Forms wurde komplett
via dem Forms-Designer durchgeführt.
In das zweiten Form reiche ich die BindingSource des ersten Forms durch
und setze die Instanzvariable der BindingSource des zweiten Forms auf diese
Referenz.

Jetzt zu dem eigentlichen Problem:

Normalerweise würde ich erwarten das ich im Unterformular den aktuell
ausgewàhlten
Satz aus dem DataGridView des ersten Formulars angezeigt bekomme.
Dem ist aber nicht so. Es gibt weder einen Fehler noch wird irgend etwas
angezeigt.

Die einzige Möglichkeit zu dem eigentlich gewünschtem Ergebnis zu kommen ist
jetzt
folgende:

Ich laufe in einer Schleife (innerhalb des Form_Load() - Events des zweiten
Forms) über alle Controls,
merke mir deren Binding-Einstellungen. Anschließend setzte ich diese via
DataBindings.Clear()
zurück um sie dann neu zu setzen.

Das kann es doch aber wohl nicht sein oder ?

Schon mal vielen Dank für eine Paar 'erleuchtende' Hinweise.


Gruß Matthias


Meine Umgebung:

- Visual Studio 2008 Prof./C#3.0/.Net 3.5/LINQ to SQL
- SQL-Server 2005
- WinXP SP2
 

Lesen sie die antworten

#1 Peter Fleischer
27/02/2008 - 06:48 | Warnen spam
"Matthias Bunge" schrieb im Newsbeitrag
news:%2345$

Kann mir vielleicht jemand folgendes Verhalten erklàren:



Hi Matthias,
das ist ganz einfach. Schau dir mal den vom Designer generierten Code an.

Ich habe 2 Forms.
Auf dem ersten befindet sich ein DataGridView welches
via BindingSource an einer Collection vom Typ ' IQueryable' hàngt
Dieses Grid dient nur zur Anzeige bzw. Vorfilterung von Datensàtzen.
Nach Auswahl eines Datensatzes gelangt man in das zweite Form,
auf welchem sich eine entprechende Anzahl von Textboxen, Checkboxen,
Comboboxen etc. befindet um diesen bearbeiten zu können.
Die nötigen Einstellungen für die Datenbindung beider Forms wurde komplett
via dem Forms-Designer durchgeführt.
In das zweiten Form reiche ich die BindingSource des ersten Forms durch
und setze die Instanzvariable der BindingSource des zweiten Forms auf
diese Referenz.



Der Designer hat aber Code generiert, der bereits vor deiner Zuweisung den
Wert deiner Instanzvariablen den Binding-Objekten mitgeteilt hat. Wenn du
jetzt die Instanzvariable anders belegst (Verweis auf ein anderes
BindingSource-Objekt), bekommen das die Binding-Objekte nicht mehr mit.

Jetzt zu dem eigentlichen Problem:

Normalerweise würde ich erwarten das ich im Unterformular den aktuell
ausgewàhlten
Satz aus dem DataGridView des ersten Formulars angezeigt bekomme.
Dem ist aber nicht so. Es gibt weder einen Fehler noch wird irgend etwas
angezeigt.



Das ist doch logisch, da die Binding-Objekte nicht von deiner neuen
BindingSource wissen, da sie nur die BindingSource kennen, die ihnen mit dem
vom Designer generierten Code bereits vorher zugewiesen wurde. Warum diese
keine Datensàtze verwaltet, musst du schon selbst wissen.

Die einzige Möglichkeit zu dem eigentlich gewünschtem Ergebnis zu kommen
ist jetzt
folgende:

Ich laufe in einer Schleife (innerhalb des Form_Load() - Events des
zweiten Forms) über alle Controls,
merke mir deren Binding-Einstellungen. Anschließend setzte ich diese via
DataBindings.Clear()
zurück um sie dann neu zu setzen.

Das kann es doch aber wohl nicht sein oder ?



Das ist eine Möglichkeit.

Schon mal vielen Dank für eine Paar 'erleuchtende' Hinweise.



Entweder du verzichtest auf den vom Designer generierten Standardablauf und
machst es so, wie du es wünschst, oder du nutzt das vom Designercode
erzeugte BindingSource-Objekt und weist diesem die Eigenschaften z.B. einer
statischen Datenquelle zu, sodass unterschiedliche BindingSource-Objekte
(z.B. in verschiedenen Formularen) die gleiche Datenbasis nutzen.
Synchronisieren musst du dann bei bedarf selbst, da jedes
BindingSource-Objekt seine eigene Sicht und Manager nutzt. Ich nutze aber
lieber eine Objectdatasource, die wiederum auf statische Datenquellen
zugreift. Da entfàllt auch das Synchronisationsproblem, wenn das
BindingSource-Objekt auch statisch ist.

Viele Gruesse

Peter

Ähnliche fragen