Laden...

DataBindings und Hashtables

Erstellt von darefilz vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.200 Views
D
darefilz Themenstarter:in
123 Beiträge seit 2004
vor 17 Jahren
DataBindings und Hashtables

Hallo.

Es gab schonmal ein Thema zu Hashtable <-> Databinding.
Ich habe mir das durchgelesen, aber entweder Hashtables sind gänzlich ungeeigenet für DataBinding oder mein Problem ist einfach ein anderes. (Wobei ich mittlerweile der Überzeugung bin, dass ersteres auf jeden Fall zutrifft).

Wie auch immer. Mein Problem ist eigentlich ganz simpel:
Erstmal habe ich eine Hashtable. Die Hashtable hat als Keys Strings und als Values wieder Hashtables, die nach dem gleichen Schema gebaut sind.
Jezt habe ich noch eine oder mehrere ListBox(en), an die ich diese Hashtables binden will.

Ich dachte mir das folgendermaßen:
Da Hashtable ja nicht IList implementiert, habe ich mir eine Hilfsklasse gebaut.


public class ListControlDataItem<TData>
{
	private string text;
	private TData data;

	public ListControlDataItem(string text, TData data)
	{
		this.text = text;
		this.data = data;
	}

	public TData Data
	{
		get { return this.data; }
	}

	public string Text
	{
		get { return this.text; }
	}
}

Generisch deswegen, weil ich die Klasse auch noch für andere Dinge brauche.
Auf jeden Fall werden die Keys in das Text-Property und die Values (wieder Hashtables) in TData gekapselt.

Ich schreib's mal eben auf...


private List<ListControlDataItem<Hashtable>> arrayVonDataItems(Hashtable hashtable)
{
	List<ListControlDataItem<Hashtable>> list = new List<ListControlDataItem<Hashtable>>();

	foreach(DictionaryEntry e in hashtable)
	{
		list.Add(new ListControlDataItem(e.Key, e.Value));
	}
	return list;
}

Hab ich jetzt von Hand geschrieben, müsste aber stimmen...

Das Setzen der DataSource der ersten Listbox sieht dann quasi so aus:


private void setDataSource()
{
	listBox1.DisplayMember = "Text";
	listBox1.ValueMember = "Data";
	listBox1.DataSource = arrayVonDataItems(hashtable1); oder so
}

Klappt auch.

Aber wie binde ist jetzt die weiteren Listboxen an die verschachtelten Hashtables?

Ich sowas versucht:


private void bind()
{
	listBox2.DisplayMember = "Text";
	listBox2.ValueMember = "Data";
	listBox2.DataBindings.Add("DataSource", listBox1, "SelectedValue");
}

oder auch versucht mit den Format- und Parse-Events der Binding-Klasse zu arbeiten.
Aber nichts funktioniert. Er verheddert sich immer mit den Typkonvertierungen. Ist ja auch irgendwie klar, aber ich weiß nicht, wie ich ihm beibringen soll, dass das arrayVonDataItems((Hashtable)listBox1.SelectedValue) die DataSource der zweiten ListBox sein soll.

Ich hoffe, ich habe das Problem klar geschildert und hoffe auf Lösungsvorschläge. Die können auch durchaus ganz anders sein, als meiner, nur die bekloppte Hashtable-Verschachtelung ist leider fest.

Vielen Dank und liebe Grüße, _void

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo _void,

gerade wenn du setDataSource generisch implementiert hast, müsste es doch auch verwendbar sein, um die untergeordneten Hashtables damit an die gewünschten Controls zu binden.

herbivore

D
darefilz Themenstarter:in
123 Beiträge seit 2004
vor 17 Jahren

Hm, ich glaube sogar gar nicht mal, dass es mit den Generics steht oder fällt.
Die Sache ist ja, dass

listBox2.DataBindings.Add("DataSource", listBox1, "SelectedValue");

so erstmal nicht klappen kann, weil hinter dem SelectedValue ja eine Hashtable steht.
Ich habe versucht, dass über das Format-Event zu machen,


private void binding_Format(object sender, ConvertEventArgs e)
{
	e.Value = arrayVonDataItems((Hashtable)e.Value);
}

aber er sagt mir immer, dass die Datenquelle weder IList noch IListSource implementiert...

Ich weiß aber nicht, wie es sonst gehen soll.

_void