Forums Neueste Beiträge
 

Doppeltes DataBinding mit Liste

28/01/2009 - 13:18 von Karl Sparwald | Report spam
Hallo NG,

ich hab eine Frage zum DataBinding.
Ich habe eine Liste (List<Currency> CurrenyList) und möchte diese Liste zwei
Controls zuweisen.
Nun wird einem DataGrid und einer ComboBox diese Liste (die gleiche) über
ihre DataSource zugewiesen.
Wenn ich jetzt im Grid oder in der ComboBox eine Wàhrung auswàhle wird im
anderen Control auch diese angezeigt.

Mich würde interessieren wie dieses Verhalten zustande kommt.
Ich dacht um diese Verhalten hinzubekommen müsste ich eine gemeinsame
BindingSource definieren.

Danke

Karl
 

Lesen sie die antworten

#1 Elmar Boye
28/01/2009 - 16:58 | Warnen spam
Hallo Karl,

Karl Sparwald schrieb:
ich hab eine Frage zum DataBinding.
Ich habe eine Liste (List<Currency> CurrenyList) und möchte diese Liste zwei
Controls zuweisen.
Nun wird einem DataGrid und einer ComboBox diese Liste (die gleiche) über
ihre DataSource zugewiesen.
Wenn ich jetzt im Grid oder in der ComboBox eine Wàhrung auswàhle wird im
anderen Control auch diese angezeigt.

Mich würde interessieren wie dieses Verhalten zustande kommt.



Die Datenbindung bezieht ihre Informationen über den BindingContext:
<URL:http://msdn.microsoft.com/de-de/lib...t.aspx>

Wenn Du eine Liste angibst, so wird über den BindingContext ermittelt
ob er bereits einmal gebunden wurde, wenn ja wird der gleiche geliefert.
Container Steuerelemente (von ContainerControl abgeleitet) können ihren
eigenen BindingContext verwalten, alle anderen suchen die Hierarchie
nach oben ab, bis sie einen finden.

Herauskommt jeweils ein BindingManagerBase, im Falle einer Liste (IList)
wàre das konkret ein CurrencyManager.

Um nun unterschiedliche Listen zu erhalten, mußt müssen sie unterschiedliche
Referenzen haben. Das kannst Du erreichen, indem Du die Liste in einer
BindingList<> oder einer BindingSource kapselst.

Hàttest Du eine DataTable müsstest Du eine neue DataView
erstellen, wie die Tage schon mal erlàutert:
<URL:http://groups.google.de/group/micro...883771>

Wenn Du an ein DataSet bindest, so wird auch der DataMember des
BindingContext interessant. Dort wàre der BindingMember.BindingPath
anzugeben. Was beim DataSet die DataTable (bzw. deren DefaultView)
oder eine Relation sein kann.

Ich dacht um diese Verhalten hinzubekommen müsste ich eine gemeinsame
BindingSource definieren.



Die BindingSource ist nur eine bunte Oberflàchen-Erweiterung,
die es ermöglicht, unterschiedlichen Listen zu steuern,
ohne sich mühsam einen CurrencyManager via BindingContext besorgen
zu müssen (was bei .NET 1.x noch notwendig war).
An der Mechanik àndert sie nichts und dafür ist sie auch nicht zustàndig.
Sie erstellt im Hintergrund selbst einen CurrencyManager.

Unten habe ich noch etwas Beispielcode angehàngt, wo ich ein
DataGridView und drei ComboBoxen an eine Liste gehàngt habe.

Gruß Elmar

private void MultiBindingForm_Load(object sender, EventArgs e)
{
Currency[] currencyArray = new Currency[]
{
new Currency("EUR", "Euro"),
new Currency("USD", "US Dollar")
};

List<Currency> list = new List<Currency>(currencyArray);

// Diese drei bewegen sich im Gleichtakt...
this.dataGridView1.DataSource = list;

this.comboBox1.DataSource = list;
this.comboBox1.DisplayMember = "Description";
this.comboBox1.ValueMember = "Name";

this.comboBox2.DataSource = list;
this.comboBox2.DisplayMember = "Description";
this.comboBox2.ValueMember = "Name";

// Dieser macht sich selbstàndig.

this.comboBox3.DataSource = new BindingList<Currency>(list);
// oder
// this.comboBox3.DataSource = new BindingSource(list, "");
this.comboBox3.DisplayMember = "Description";
this.comboBox3.ValueMember = "Name";
}

private void button1_Click(object sender, EventArgs e)
{
BindingManagerBase dataGridViewBindingManager this.dataGridView1.BindingContext[this.dataGridView1.DataSource];
BindingManagerBase comboBox1BindingManager this.BindingContext[this.comboBox1.DataSource];
BindingManagerBase comboBox2BindingManager this.BindingContext[this.comboBox2.DataSource];

BindingManagerBase comboBox3BindingManager this.BindingContext[this.comboBox3.DataSource];

// Ist ein CurrencyManager...
Console.WriteLine("DataGridView: {0}", dataGridViewBindingManager.GetType());

// gleiche...
Console.WriteLine("\tentspricht {0}: {1}", comboBox1.Name,
Object.ReferenceEquals(dataGridViewBindingManager, comboBox1BindingManager));
Console.WriteLine("\tentspricht {0}: {1}", comboBox2.Name,
Object.ReferenceEquals(dataGridViewBindingManager, comboBox2BindingManager));

// ungleich...
Console.WriteLine("\tentspricht {0}: {1}", comboBox3.Name,
Object.ReferenceEquals(dataGridViewBindingManager, comboBox3BindingManager));

Console.WriteLine("ComboBox3: List.Type: {0}:",
((CurrencyManager)comboBox3BindingManager).List.GetType());
}
}

internal class Currency
{
public Currency(string name, string description)
{
this.Name = name;
this.Description = description;
}

public string Name { get; set; }
public string Description { get; set; }
}

Ähnliche fragen