Wie erstelle ich einen Wizard (analog zum Serienbrief-Assistenten) in Microsoft Office?

Veröffentlicht: 10. Aug 2006

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.