Von Bildern in Bäumen: ImageIndex statt SelectedImageIndex

Um schnell und zuverlässig Baumstrukturen in .NET-Anwendungen darzustellen, ist das TreeView-Steuerelement mit seiner Vielzahl an Möglichkeiten zur Gestaltung und Navigation hervorragend geeignet.
Diese Tatsache ist seit Jahren ebenso hinlänglich bekannt wie die Option, dass man für TreeNodes beliebige Grafiken auf Basis von ImageLists hinterlegen und verwalten kann, um dem Baumdiagramm zugunsten einer besseren UX ein wenig auf die Sprünge zu helfen. 
Grundlegend stehen zwei Möglichkeiten der Zuweisung zur Verfügung: Image und SelectedImage – letzteres wird aktiv, sobald ein Eintrag/Element (TreeNode) ausgewählt wird.

Leider ist es nicht ohne Weiteres vorgesehen, auf das SelectedImage vollständig zu verzichten, wenn man keins benötigt – sobald man eine ImageList hinterlegt hat, führt dies dazu, dass automatisch das erste Element in der Imagelist als Default-Wert in den Eigenschaften Image und SelectedImage hinterlegt wird. Diese Eigenheit hat zur Folge, dass – sofern man seine TreeNodes mit verschiedenen Grafiken ausgestattet hat und nicht für jedes TreeNode-Objekt ein eigenständiges SelectedImage hinterlegt hat – jedes Mal bei der Selektion einer TreeNode im Baum wieder das erste Bild der ImageList angezeigt wird. Im beiliegenden Beispiel/Video kann man dieses Verhalten im oberen TreeView-Steuerelement (rötlich hinterlegt) nachvollziehen.

Der in nachfolgendem Code-Schnipsel dargestellte, minimale Workaround sorgt im unteren TreeView (hellgrün hinterlegt) dafür, dass bei der Auswahl einer TreeNode automatisch die der TreeNode zugewiesene Grafik verwendet wird:

private void treeViewBottom_AfterSelect(object sender,
TreeViewEventArgs e)
{

if (e.Node.ImageIndex != -1)
// Handle selected image: Use given image of current
// node instead of SelectedImage-default

e.Node.SelectedImageIndex = e.Node.ImageIndex;
else
// Handle selected image: Use default image of TreeView
// control, if no explicit node image was set

e.Node.SelectedImageIndex = ((TreeView)sender).ImageIndex;
#region demostuff
propertyGridControls.Refresh();
#endregion

}

Die Funktion selbst ist recht simpel; die Wirkung hingegen spart Einiges an Arbeit und verhilft zu einer stimmigeren Benutzerführung/-erfahrung, indem im AfterSelect-Event lediglich die Eigenschaft SelectedImageIndex der ausgewählten TreeNode auf den ImageIndex (die Standardgrafik) der ausgewählten TreeNode gesetzt wird.

Über Thomas Roschinsky
Software Engineer | .NET | SharePoint | Dynamics CRM | BI | C# | C/C++

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: