ComboBox Databinding: Reihenfolge beachten


Heute bin ich auf einen Interessanten Artikel auf CodeProject gestoßen (zwar schon fast 9 Jahre alt, aber immer noch aktuell ;-))

Darin geht es darum, dass es nicht egal ist welche Reihenfolge man beim setzen der DataSource, ValueMember und DisplayMember-Eigenschaften einhält.

Ich hätte erwartet, dass die Reihenfolge egal ist, oder das man evtl. sogar die DataSource vor dem DisplayMember bzw. ValueMember setzen muss (Damit es keine Probelme gibt wenn die Spalten nicht in der DataSource gefunden werden). Aber falsch gedacht! Gerade diese Reihenfolge ist falsch.

Denn in dieser Reihenfolge werden die SelectedIndexChanged bzw. SelectedItemChanged-Ereignisse 3 mal hintereinander „gefeuert“. Gerade wenn man etwas anspruchsvollere Dinge in diesen Events macht, kann das die Performance schon recht deutlich beeinflussen.

Die richtige Reihenfolge ist: DataSource zuletzt setzen. Dadurch werden die Events nur 1 mal ausgelöst.

ComboBox.ValueMember = "ID"
ComboBox.DisplayMember = "Name"
ComboBox.DataSource = dataTable

Allerdings bin ich durch diese Vorgehensweise auf ein Problem gestoßen:
In einem meiner Projekte wechsle ich die DataSource je nach Auswahl des Users. Die Tabellen haben jedoch auch unterschiedliche Spaltentitel, dadurch muss ich auch den DisplayMember ändern.

Beim „umschalten“ der DataSource lege ich also (wie gerade gelernt) zuerst die DisplayMember und ValueMember fest, und anschließend die DataSource. Was passiert? Meine ComboBox zeigt statt dem richtigen DisplayMember nur System.Data.DataRowView an.

Scheinbar findet beim zuweisen dieser Eigenschaften doch eine Prüfung statt, ob die Spalten überhaupt in der DataSource existieren. Dadurch dass die Datenquelle zum Zeitpunkt des festlegens des DisplayMembers noch auf die „alte“ DataTable festgelegt ist, schmeißt er mir den DisplayMember wohl wieder raus, da er ihn nicht in der Datenquelle findet.

Die Lösung besteht darin, die alte DataSource vorher auf Nothing zu setzen. Dann kann man ohne Probleme zuerst ValueMember und DisplayMember setzen, und zum Schluss die DataSource.

' Wechseln der DataSource
ComboBox.DataSource = Nothing

ComboBox.ValueMember = "ID"
ComboBox.DisplayMember = "Name"
ComboBox.DataSource = dataTable
,

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.