Wie erstelle ich einen Wizard (analog zum Serienbrief-Assistenten) in Microsoft Office?
Lösung
In diesem How-to-Guide wird vorgestellt, wie ein Wizard umgesetzt werden kann, der ähnlich zum Serienbrief-Assistenten von Microsoft Office aufgebaut ist. Dies hat den großen Vorteil, dass dem Benutzer eine ihm bereits vertraute und simple Methode geboten wird, sein Office-Dokument zu bearbeiten bzw. Eingaben vorzunehmen.
Es ist zunächst notwendig, alle Schritte eines Wizards zu vereinheitlichen, so dass alle Wizard-Schritte das gleiche grundlegende Design und auch die gleichen elementaren Eigenschaften und auch Methoden besitzen. Dies wird erreicht, indem ein neues Benutzersteuerelement (UserControl) erstellt wird, von dem jeder Wizard-Schritt (ebenfalls Benutzersteuerelemente) erbt.
In diesem Fall wird dieses grundlegende Benutzersteuerelement WizardBasePanel benannt.
Zusätzlich wird im WizardBasePanel eine erste(s) Eigenschaft (Property) Description definiert, so dass zu jedem Wizard-Schritt eine Beschreibung angegeben werden kann.
Public Class WizardBasePanel
Private DescriptionText As String
Public Property Description() As String
Get
Return DescriptionText
End Get
Set(ByVal value As String)
DescriptionText = value
End Set
End Property
End Class
Nun kann der erste Wizard-Schritt erstellt werden. Dazu fügt man zu dem Projekt ein neues Benutzersteuerelement hinzu und nennt es beispielsweise Panel1. Um vom WizardBasePanel zu erben, muss folgende Zeile in der Code-Datei hinzugefügt werden:
Public Class Panel1 Inherits WizardBasePanel End Class
Nun muss ein weiteres Benutzersteuerelement erstellt werden, dass für die Logik des Wizards, dessen Darstellung und dessen Navigation verantwortlich ist. Zu dem neu erstellten Benutzersteuerelement werden ein Panel mit dem Namen WizardPanel und zwei LinkLabels hinzugefügt. Die LinkLabels sollen für das navigieren zwischen den Wizard-Schritten verantwortlich sein und werden PreviousLink und NextLink benannt.
Der folgende Code implementiert die gesamte Funktionsweise des Wizards.
Imports System.Collections.Generic Public Class Wizard Private currentPanelIndex As Integer Private currentPanels As List(Of WizardBasePanel) Private Sub PreviousLink_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles PreviousLink.Click currentPanelIndex = currentPanelIndex - 1 RefreshWizardMainPanel() End Sub Private Sub NextLink_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles NextLink.Click currentPanelIndex = currentPanelIndex + 1 RefreshWizardMainPanel() End Sub Public Sub StartWizard(ByVal panels As List(Of WizardBasePanel)) currentPanels = panels currentPanelIndex = 0 RefreshWizardMainPanel() End Sub Private Sub RefreshWizardMainPanel() Me.WizardPanel.Controls.Clear() Me.WizardPanel.Controls.Add(currentPanels(currentPanelIndex)) currentPanels(currentPanelIndex).Dock = DockStyle.Fill If currentPanelIndex > 0 Then PreviousLink.Text = currentPanels(currentPanelIndex – 1).Description Else PreviousLink.Text = "" End If If currentPanelIndex < currentPanels.Count - 1 Then NextLink.Text = currentPanels(currentPanelIndex + 1).Description Else NextLink.Text = "" End If End Sub End Class
Zum Schluss muss der Wizard lediglich beim Öffnen des Office-Dokumentes in der ActionsPane angezeigt werden. Dafür muss in der Methode des StartUp-Ereignises in der ThisDocument.vb Datei folgender Code geschrieben werden.
Dim sampleWizard As New Wizard Dim samplePanels As New System.Collections.Generic.List(Of WizardBasePanel) samplePanels.Add(New Panel1) samplePanels.Add(New Panel2) samplePanels.Add(New Panel3) sampleWizard.StartWizard(samplePanels) Globals.ThisDocument.ActionsPane.Controls.Add(sampleWizard) sampleWizard.Dock = DockStyle.Fill
Damit ist ein recht einfach aufgebauter Wizard fertig, der in einem Office-Dokument eingebettet ist.