C# DataSource zur Laufzeit ändern

Registriert
Okt. 2010
Beiträge
3
Hallo...

Ich habe folgendes Problem:

ich habe ein Datagridview, welches als DataSource eine DataTable besitzt.

In meinem Formular befindet sich eine Checkbox, welche Standartmäßig aktiviert ist.

Nun soll beim deaktivieren eine andere Datatable als DataSource benutzt werden.

Um dies erkenntlich zu machen wird erst die DataSource auf null gesetzt -> Daten verschwinden im Formular

Anschließend wird eine berechnung ausgeführt und dann die neue DataTable übergeben

Jedoch werden mir keine Daten im Formular angezeigt.

Ich habe mal einen Haltepunkt gesetzt und mir die Sache angeschaut.

Die Datagridview.DataSource.Rows.Count Eigenschaft liefert mir die Anzahl der im neuen DataTable erfassten Reihen. Sieht gut aus....

aber die Datagridview.Rows.Count Eigenschaft gibt 0 zurück.

Häääh?

Das versteh ich einfach nicht.

Ich habe nach ersten Recherchen eine BindingSource dazwischen geklemmt.

Code:
BindingSource.DataSource = DataTable1;
Datagridview.DataSource = BindingSource;

BindingSource.DataSource = DataTable2;
BindingSource.EndEdit()

Kann mir jemand sagen was ich falsch mache?

mfg

Jeff
 
Hallo!

Erst einmal ein paar Fragen:
1. Du setzt doch, wenn ich das richtig sehe nur die DataSource der BindingSource um. Die DataSource des DataGridViews ist und bleibt doch die BindingSource?
2. Warum rufst Du EndEdit() nachdem Du die DataSource der BindingSource umgesetzt hast? Bist Du noch im Berarbeiten-Modus während Du die DataSources austauschst?
3. Warum rufst Du nicht ResetItem() der BindingSource nachdem Du die DataSources ausgetauscht hast?
4. Verwaltung von DataTables bitte in einem DataSet - dieses ist im Gegensatz zu DataTables auch serialisierbar.

Sollte es dann immer noch nicht gehen, Folgendes versuchen:

Code:
Datagridview.DataSource = null;
BindingSource.DataSource = DataTable2;
BindingSource.ResetItem();
Datagridview.DataSource = BindingSource;

Grüße
DrTopo
 
Erstmal Danke für die antwort...

Ich habe das Problem nun gelöst...deine 1. Frage hat mir die Augen geöffnet.
Die DataSource des DataGridViews ist und bleibt doch die BindingSource

Ich habe zwar der
Code:
BindingSource.DataSource
eine neue DataTable zugewiesen, jedoch die
Code:
Datagridview.DataSource = null
gesetzt. Wenn ich die
Code:
BindingSource.DataSource = null
anstelle der
Code:
Datagridview.DataSource = null
setze funktioniert es problemlos....

vielen dank nochmal



EDIT:


Achja...zu deinen anderen Fragen:

2.Ich hab vorher noch nicht mit BindingSource's gearbeitet, dachte nach jeder Änderung (also auch einer neuen Source-Zuweisung) muss das EndEdit() ausgeführt werden

3. Aufgrund fehlender Erfahrung kannte ich nicht die ResetItem-Methode(wobei cih eben bemerkt habe dass sie einen parameter erfordert der das "Item" spezifiziert, welches resetet werden soll.....wobei ich nich weiß was mit "Item" gemeint ist....

4. Zur Kenntnis genommen ;-)
Ergänzung ()

Hm....

zu früh gefreut......

also Es werden nun zwar Daten angezeigt, aber......

Das Datagridview hat gerade mal eine Row.....wobei die DataSource die tatsächliche Anzahl an Reihen hat...

Beim ursprünglichen laden hatte jedoch nach Übergabe der DataSource die das DataGrid die tatsächliche Reihenanzahl.....

was läuft hier falsch?
 
Zuletzt bearbeitet:
ein ähnliches Thema gibts hier schon... Such nach C# und Datagridview. Da wird alles erklärt. Wenn du deine DataSource erweitern willst gibt es genau da zu eine Lösung.
 
Ok....

Also ich habe gesucht aber nichts hilfreiches gefunden....

Da aber mein Programm etwas komplexer ist, habe ich einfach mal ein neues Test-Programm aufgesetzt.


Ein Datagridview, welches im FormLoad-Event eine als Klassenvariable deklarierte BindingSource als DataSource zugewiesen bekommt.

Desweitere sind 2 DataTable als Klassenvariablen deklariert, welche ebenfalls im FormLaod-Event unterschiedliche Daten zugewiesen bekommen.

Klassenvariablen
Code:
BindingSource bindingsource = new BindingSource();
DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();

FormLoad-Event
Code:
private void Form1_Load(object sender, EventArgs e)
{
            dataGridView1.DataSource = bindingsource;

            dt1.Columns.Add("Spalte 1");
            dt1.Columns.Add("Spalte 2");
            dt2.Columns.Add("Spalte 1");
            dt2.Columns.Add("Spalte 2");
            dt2.Columns.Add("Spalte 3");

            object[] Reihe1 = { "test1", "test2" };           
            object[] Reihe2 = { "test1", "test2","test3" };            

            dt1.Rows.Add(Reihe1);
            dt1.Rows.Add(Reihe1);

            dt2.Rows.Add(Reihe2);
            dt2.Rows.Add(Reihe2);
            dt2.Rows.Add(Reihe2);
}

Ich habe 3 Buttons ins Formular eingebunden:

Button1:
Code:
bindingsource.DataSource = dt1;

Button2:
Code:
bindingsource.DataSource = dt2;

Button3:
Code:
MessageBox.Show("Datagridview hat " + dataGridView1.RowCount + " Reihen.\nDataSource hat " + ((DataTable)bindingsource.DataSource).Rows.Count + " Reihen.");

Denn nach meinen gesammelten Erfahrungen müsste dies nun funktionieren.....

.....und siehe da:

Es funktioniert.

Nach jedem Wechsel der DataSource hatte das Datagridview die Tatsächliche Anzahl an Reihen, genau wie die DataSource. :)

Ich hatte also in meinem richtigen Programm einen anderen Fehler, nachdem ich es nochmal Schritt für Schritt durchgegangen bin und diverse Schritte anders gelöst habe, funktioniert es jetzt auch.

Nochmals danke
 
Zurück
Oben