TreeView für Outlook-Ordner

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Anzeige der Ordner in Outlook

Bild 1: Anzeige der Ordner in Outlook

Im Beitrag “Outlook-Folder in Access anzeigen” liefern wir die Grundlagen zur Anzeige von Outlook-Ordnern in Access-Formularen. Dabei haben wir die einzelnen Outlook-Ordner in einem einfachen Listenfeld zur Auswahl angeboten. Im Beitrag “E-Mails verwalten mit dem Outlook View Control” wollen wir dies ein wenig professioneller gestalten und die Outlook-Ordner in einem TreeView-Steuerelement anzeigen. Wie das gelingt, erfahren Sie im vorliegenden Beitrag.

Das TreeView-Steuerelement, in dem wir die Outlook-Ordner in der gleichen hierarchischen Anordnung anzeigen wollen wie im entsprechenden Bereich von Outlook, soll die Auswahl eines der Ordner ermöglichen. Der Inhalt dieses Ordners soll in einem Outlook View Control erscheinen. Unter Outlook sieht die hierarchische Anzeige wie in Bild 1 aus.

Anzeige der Ordner in Outlook

Bild 1: Anzeige der Ordner in Outlook

Für den Anfang wollen wir uns dabei bezüglich der Icons damit begnügen, für jeden Ordner das gleiche Icon anzuzeigen, nämlich ein einfaches Ordner-Icon.

Außerdem wollen wir nur die Ordner anzeigen, die einen bestimmten Typ von Elementen enthalten. In diesem Fall sind das die Ordner, die typischerweise E-Mails enthalten. Wie Sie diese Ordner von den anderen unterschieden, erläutern wir weiter unten.

Welche Schritte sind für die Umsetzung unseres Vorhanbens nötig Zunächst benötigen wir einige Steuerelemente:

  • ein TreeView-Steuerelement und
  • ein ImageList-Steuerelement zum Speichern der zu verwendenden Icons.

Außerdem benötigen wir VBA-Code, der beim Laden des Formulars ausgelöst wird und der die betreffenden Ordner aus Outlook einliest und entsprechende Einträge im TreeView-Steuerelement anlegt.

Steuerelemente hinzufügen

Die beiden benötigten Steuerelemente fügen Sie der Entwurfsansicht eines neuen Formulars namens frmEMailDetails hinzu, indem Sie über den Ribbon-Eintrag Entwurf|Steuerelemente|ActiveX-Steuerelemente den Dialog Ac-tiveX-Steu-er-ele-ment ein-fügen öffnen. Hier wählen Sie als Erstes das Steuerelement Microsoft TreeView Control, version 6.0 aus und klicken OK (siehe Bild 2).

Hinzufügen der ActiveX-Steuerelemente

Bild 2: Hinzufügen der ActiveX-Steuerelemente

Danach führen Sie den gleichen Vorgang für das Steuerelement Microsoft ImageList Control, version 6.0 aus.

Legen Sie für dieses Steuerelement den Namen ctlImageList fest und für das TreeView-Steuerelement den Namen ctlTreeView. Ziehen Sie das TreeView-Steuerelement so auf, dass es sich am linken Rand des Formulars befindet (siehe Bild 3).

Die beiden neuen Steuerelemente im Formular

Bild 3: Die beiden neuen Steuerelemente im Formular

Icons zu ImageList-Steuerelement hinzufügen

Danach fügen wir das zunächst zu verwendende Icon zum ImageList-Steuerelement hinzu. Dazu klicken Sie doppelt auf das Steuerelement und erhalten den Dialog Eigenschaften von ImageListCtrl. Hier stellen Sie die Bildgröße auf der Registerseite General auf 16 x 16 ein (siehe Bild 4).

Festlegen der Icon-Größe

Bild 4: Festlegen der Icon-Größe

Danach wechseln Sie auf die Registerseite Images und klicken dort auf die Schaltfläche Insert Picture…, was einen Dateiauswahl-Dialog öffnet.

Hier fügen Sie nacheinander zwei Icons ein, die einen geschlossenen und einen geöffneten Ordner anzeigen (siehe Bild 5). Für diese beiden Elemente legen Sie im Feld Key die Schlüssel folder_closed und folder_open fest.

Hinzufügen und benennen der Icons

Bild 5: Hinzufügen und benennen der Icons

Einstellungen für das TreeView-Steuerelement

Danach nehmen wir die Einstellungen für das TreeView-Steuerelement vor. Das erledigen wir in der Regel per VBA, weil sich so ein Satz von Einstellungen recht leicht von einer Lösung zur nächsten übertragen lässt – das geht schneller, als wenn Sie die Einstellungen jedes Mal erneut im Eigenschaften-Fenster erledigen.

Die Einstellungen nehmen wir in einer eigenen Prozedur vor, die wir InitializeTreeView nennen. Diese rufen wir in der Ereignisprozedur auf, die beim Laden des Formulars ausgelöst wird:

Private Sub Form_Load()
     InitializeTreeView
     ...
End Sub

Die Prozedur InitializeTreeView sieht wie folgt aus:

Private Sub InitializeTreeView()
     Dim objTreeView As MSComctlLib.TreeView
     Set objTreeView = Me!ctlTreeView.Object
     With objTreeView
         .Appearance = ccFlat
         .BorderStyle = ccNone
         .Font.Name = "Calibri"
         .Font.Size = 9
         .Indentation = 200
         Set .ImageList = Me!ctlImageList.Object
         .LineStyle = tvwRootLines
         .Style = tvwTreelinesPlusMinusPictureText
         .Nodes.Clear
         FillTreeView objTreeView
         ExpandTreeViewNodes objTreeView
     End With
End Sub

Sie füllt zunächst die Variable objTreeView mit einem Verweis auf das TreeView-Steuerelement. Dann stellt sie einige Eigenschaften für das so referenzierte TreeView-Steuerelement ein. Appearance gibt an, ob es in einer 3D-Ansicht oder flach angezeigt werden soll.

Mit BorderStyle legen wir fest, dass kein Rahmen erscheinen soll – wenn, dann definieren wir diesen über die Steuerelementeigenschaften des Containers für das ActiveX-Steuerelement. Mit Font referenzieren wir das Font-Objekt, mit dessen Eigenschaften Name und Size wir die Schriftart und die Schriftgröße einstellen.

Den Standardeinzug reduzieren wir mit der Eigenschaft Indentation auf den Wert 200 (standardmäßig 567). Die Eigenschaft ImageList legt das zu verwendende ImageList-Steuerelement fest, aus dem die Icons für die TreeView-Elemente bezogen werden. Hier müssen wir wie beim TreeView-Steuerelement mit Object auf das im ActiveX-Container enthaltene Steuerelement zugreifen. LineStyle gibt mit dem Wert tvwRootLines an, dass wir schon für die Root-Elemente Linien und somit auch Plus/Minus-Zeichen anzeigen wollen. Und mit Style und dem Wert tvwTreelinesPlusMinusPictureText bestimmen wir, dass Linien, Plus/Minus-Zeichen, Icons und Text für die einzelnen Elemente angezeigt werden sollen – also das komplette Programm.

Schließlich leeren wir die Nodes-Auflistung des Steuerelements, damit eventuell bei einer früheren Anzeige noch verbliebene Elemente verschwinden und rufen die Prozedur FillTreeView auf, der wir den Verweis auf das zu füllende TreeView-Steuerelement übergeben. Nachdem dies geschehen ist, wollen wir noch den Eingeklappt/Ausgeklappt-Zustand der Elemente wiederherstellen, der vor dem letzten Schließen des Formulars Bestand hatte. Das erledigen wir mit der Prozedur ExpandTreeViewNodes, dem wir ebenfalls einen Verweis auf das TreeView-Steuerelement übergeben.

Füllen des TreeView-Steuerelements mit den Outlook-Ordner

Die Prozedur FillTreeView nimmt mit dem Parameter objTreeView einen Verweis auf das zu füllende TreeView-Steuerelement entgegen (siehe Listing 1). Sie referenziert eine neue oder die aktive Outlook-Instanz mit der Variablen objOutlook und weist der Variablen objNamespace dann mit der GetNamespace-Methode den MAPI-Namespace zu. Anschließend durchläuft sie alle Folder-Objekte, die direkt im MAPI-Namespace enthalten sind. Typischerweise sind das Ordner wie Outlook oder solche, welche nach der E-Mail-Adresse benannt sind, für die eine eigene .pst-Datei angelegt wurde. Diese Folder-Objekte durchläuft die Prozedur in einer For Each-Schleife, wobei sie das jeweilige Objekt mit der Variablen objFolder referenziert.

Private Sub FillTreeView(objTreeView As MSComctlLib.TreeView)
     Dim objOutlook As Outlook.Application
     Dim objNamespace As Outlook.Namespace
     Dim objFolder As Outlook.Folder
     Dim objNode As MSComctlLib.Node
     Set objOutlook = New Outlook.Application
     Set objNamespace = objOutlook.GetNamespace("MAPI")
     For Each objFolder In objNamespace.Folders
         If objFolder.DefaultItemType = olMailItem Then
             Set objNode = objTreeView.Nodes.Add(, , objFolder.FolderPath, objFolder.Name, "folder_closed")
             FillNode_Rek objTreeView, objNode, objFolder
         End If
     Next objFolder
End Sub

Listing 1: TreeView-Steuerelement füllen

Innerhalb der Schleife prüft die Prozedur den Typ der standardmäßig in diesem Ordner enthaltenen Elemente. Die mit der Eigenschaft DefaultItemType ermittelte Einstellung soll in diesem Fall olMailItem lauten, da wir nur die Mailordner anzeigen wollen.

Handelt es sich um einen Ordner für E-Mails, legt die Prozedur für diesen ein neues Node-Element im TreeView-Steuerelement an und referenziert dieses mit der Variablen objNode. Das Anlegen erledigen wir mit der Add-Methode der Nodes-Auflistung des Steuerelements. Dieser übergeben wir für den dritten Parameter den Wert der Eigenschaft FolderPath des Ordners, also beispielsweise //Outlook. Dieser Parameter nimmt den Wert für die Eigenschaft Key auf. Über den Schlüssel legen wir einen eindeutigen Bezeichner für jedes Element im TreeView-Steuerelement fest. Daher eignet sich der Wert der Eigenschaft FolderPath ausgezeichnet – dieser ist für jeden Ordner in Outlook eindeutig. Der vierte Parameter legt den Wert der Eigenschaft Name fest. Hier übergeben wir auch den Namen des jeweiligen Ordners. Der fünfte Parameter schließlich erwartet die Angabe des Schlüssels für das für dieses Element anzuzeigende Icon aus dem ImageList-Steuerelement. Dieses soll für alle Elemente zunächst folder_closed lauten.

Damit füllen wir allerdings zunächst nur die oberste Ebene des TreeView-Steuerelements. Um die darunter liegenden Ebenen kümmern wir uns in einer weiteren Prozedur namens FillNode_Rek. Diese ist, wie der Name schon andeutet, eine rekursiv definierte Prozedur, die sich selbst aufruft. Der Prozedur übergeben wir Verweise auf das TreeView-Steuerelement, auf das soeben angelegte Node-Element sowie auf den Ordner, für den das Node-Element angelegt wurde.

Auf diese Weise durchlaufen wir alle Elemente der ersten Ebene des MAPI-Namespace, die MailItem-Elemente enthalten.

Rekursives Füllen für die untergeordneten Ordner

Die Prozedur FillNode_Rek ist eine rekursiv definierte Prozedur, die folgende Parameter erwartet:

  • objTreeView: Verweis auf das zu füllende TreeView-Steuerelement
  • objParentNode: Verweis auf das Node-Element, unter dem die neuen Elemente angelegt werden sollen
  • objParentFolder: Outlook-Folder, dessen Unterordner dem Node-Element aus objParentNode hinzugefügt werden sollen.

Sie finden die Prozedur in Listing 2.

Private Sub FillNode_Rek(objTreeView As MSComctlLib.TreeView, objParentNode As MSComctlLib.Node, _
         objParentFolder As Outlook.Folder)
     Dim objFolder As Outlook.Folder
     Dim objNode As MSComctlLib.Node
     For Each objFolder In objParentFolder.Folders
         If objFolder.DefaultItemType = olMailItem Then
             Set objNode = objTreeView.Nodes.Add(objParentFolder.FolderPath, tvwChild, objFolder.FolderPath, _
                 objFolder.Name, "folder_closed")
             FillNode_Rek objTreeView, objNode, objFolder
         End If
     Next objFolder
End Sub

Listing 2: Unterelemente des TreeView-Steuerelements füllen

Die Prozedur definiert noch Elemente der Typen Outlook.Folder und MSComctlLib.Node, welche zum Durchlaufen der Unterordner des mit objParentFolder übergebenen Ordners und zum Anlegen der neuen Node-Elemente dienen.

In einer For Each-Schleife durchläuft die Prozedur alle Folder-Objekte des mit objParentFolder gelieferten Ordners. Darin prüft die Prozedur wieder, ob es sich bei dem Unterordner um einen E-Mail-Ordner handelt. Ist das der Fall, legt sie ein neues Element für diesen Ordner unterhalb des mit objParentNode übergebenen Node-Elements an. Dabei verwendet sie wieder die Add-Methode der Nodes-Auflistung des TreeView-Steuerelements aus objTreeView. Diesmal werden auch die ersten beiden Parameter der Add-Methode verwendet.

Der erste nimmt den Key-Wert des Node-Elements entgegen, zu dem das neue Element in einer bestimmten Relation angelegt werden soll (hier mit objParentFolder.FolderPath angegeben – wir hätten auch objParentNode.Key verwenden können). Diese Relation geben wir mit dem zweiten Parameter der Add-Methode an. Da das neue Element dem mit objParentNode angegebenen Element untergeordnet werden soll, stellen wir den zweiten Parameter auf den Wert tvwChild ein.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar