From f4de82bcdafba51e4eed9cae6b2d3e5375ffd115 Mon Sep 17 00:00:00 2001
From: xue <>
Date: Tue, 9 May 2006 12:11:38 +0000
Subject:
---
.../protected/pages/Controls/Button.page | 2 +-
.../protected/pages/Controls/CheckBox.page | 2 +-
.../protected/pages/Controls/ColorPicker.page | 2 +-
.../quickstart/protected/pages/Controls/Data.page | 2 +-
.../protected/pages/Controls/DataGrid.page | 24 +++++++++++-----------
.../protected/pages/Controls/DataList.page | 2 +-
.../protected/pages/Controls/DatePicker.page | 2 +-
.../protected/pages/Controls/Expression.page | 2 +-
.../protected/pages/Controls/FileUpload.page | 2 +-
.../quickstart/protected/pages/Controls/Head.page | 2 +-
.../protected/pages/Controls/HiddenField.page | 2 +-
.../protected/pages/Controls/HtmlArea.page | 2 +-
.../protected/pages/Controls/HyperLink.page | 2 +-
.../quickstart/protected/pages/Controls/Image.page | 2 +-
.../protected/pages/Controls/ImageButton.page | 2 +-
.../protected/pages/Controls/ImageMap.page | 2 +-
.../protected/pages/Controls/InlineFrame.page | 2 +-
.../protected/pages/Controls/JavascriptLogger.page | 2 +-
.../quickstart/protected/pages/Controls/Label.page | 2 +-
.../protected/pages/Controls/LinkButton.page | 2 +-
.../quickstart/protected/pages/Controls/List.page | 12 +++++------
.../protected/pages/Controls/Literal.page | 2 +-
.../protected/pages/Controls/MultiView.page | 2 +-
.../protected/pages/Controls/NewControl.page | 18 ++++++++--------
.../quickstart/protected/pages/Controls/Panel.page | 2 +-
.../protected/pages/Controls/PlaceHolder.page | 2 +-
.../protected/pages/Controls/RadioButton.page | 2 +-
.../protected/pages/Controls/Repeater.page | 2 +-
.../protected/pages/Controls/SafeHtml.page | 2 +-
.../protected/pages/Controls/Statements.page | 2 +-
.../quickstart/protected/pages/Controls/Table.page | 2 +-
.../protected/pages/Controls/TextBox.page | 2 +-
.../protected/pages/Controls/TextHighlighter.page | 2 +-
.../protected/pages/Controls/Validation.page | 16 +++++++--------
.../protected/pages/Controls/Wizard.page | 16 +++++++--------
35 files changed, 73 insertions(+), 73 deletions(-)
(limited to 'demos/quickstart/protected/pages/Controls')
diff --git a/demos/quickstart/protected/pages/Controls/Button.page b/demos/quickstart/protected/pages/Controls/Button.page
index e58571d3..5c827725 100644
--- a/demos/quickstart/protected/pages/Controls/Button.page
+++ b/demos/quickstart/protected/pages/Controls/Button.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/CheckBox.page b/demos/quickstart/protected/pages/Controls/CheckBox.page
index 77052997..7f2767c0 100644
--- a/demos/quickstart/protected/pages/Controls/CheckBox.page
+++ b/demos/quickstart/protected/pages/Controls/CheckBox.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/ColorPicker.page b/demos/quickstart/protected/pages/Controls/ColorPicker.page
index 6e05584a..8909ad98 100644
--- a/demos/quickstart/protected/pages/Controls/ColorPicker.page
+++ b/demos/quickstart/protected/pages/Controls/ColorPicker.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/Data.page b/demos/quickstart/protected/pages/Controls/Data.page
index 36839582..6a93ec6f 100644
--- a/demos/quickstart/protected/pages/Controls/Data.page
+++ b/demos/quickstart/protected/pages/Controls/Data.page
@@ -1,6 +1,6 @@
TDatagrid is an important control in building complex Web applications. It displays data in a tabular format with rows (also called items) and columns. A row is composed by cells, while columns govern how cells should be displayed according to their association with the columns. Data specified via DataSource or DataSourceID are bound to the rows and feed contents to cells.
@@ -12,7 +12,7 @@ TDataGrid is highly interactive. Users can sort the data along specified columns
Rows of TDataGrid can be accessed via its Items property. A row (item) can be in one of several modes: browsing, editting and selecting, which affects how cells in the row are displayed. To change an item's mode, modify EditItemIndex or SelectedItemIndex. Note, if an item is in edit mode, then selecting this item will have no effect.
Columns of a data grid determine how the associated cells are displayed. For example, cells associated with a TBoundColumn are displayed differently according to their modes. A cell is displayed as a static text if the cell is in browsing mode, a text box if it is in editting mode, and so on.
TDataGrid defines different styles applied to its items. For example, AlternatingItemStyle is applied to alternating items (item 2, 4, 6, etc.) Through these properties, one can set CSS style fields or CSS classes for the items.
TDataGrid provides several events to facilitate manipulation of its items,
TDataGrid by default will create a list of columns based on the structure of the bound data. TDataGrid will read the first row of the data, extract the field names of the row, and construct a column for each field. Each column is of type TBoundColumn.
Using automatically generated columns gives a quick way of browsing tabular data. In real applications, however, automatically generated columns are often not sufficient because developers have no way customizing their appearance. Manually specified columns are thus more desirable.
Besides the rich data presentation functionalities as demonstrated in previous section, TDataGrid is also highly user interactive. An import usage of TDataGrid is editting or deleting rows of data. The TBoundColumn can adjust the associated cell presentation according to the mode of datagrid items. When an item is in browsing mode, the cell is displayed with a static text; when the item is in editting mode, a textbox is displayed to collect user inputs. TDataGrid provides TEditCommandColumn for switching item modes. In addition, TButtonColumn offers developers the flexibility of creating arbitrary buttons for various user interactions.
TDataGrid supports sorting its items according to specific columns. To enable sorting, set AllowSorting to true. This will turn column headers into clickable buttons if their SortExpression property is not empty. When users click on the header buttons, an OnSortCommand event will be raised. Developers can write handlers to respond to the sort command and sort the data according to SortExpression which is specified in the corresponding column.
When dealing with large datasets, paging is helpful in reducing the page size and complexity. TDataGrid has an embedded pager that allows users to specify which page of data they want to see. The pager can be customized via PagerStyle. For example, PagerStyle.Visible determines whether the pager is visible or not; PagerStyle.Position indicates where the pager is displayed; and PagerStyle.Mode specifies what type of pager is displayed, a numeric one or a next-prev one.
The paging functionality shown above requires loading all data into memory, even though only a portion of them is displayed in a page. For large datasets, this is inefficient and may not always be feasible. TDataGrid provides custom paging to solve this problem. Custom paging only requires the portion of the data to be displayed to end users.
TButton
+TButton
TCheckBox
+TCheckBox
TColorPicker
+TColorPicker
Data Controls
+Data Controls
-TDataGrid
+TDataGrid
Columns
+Columns
Item Styles
+Item Styles
Events
+Events
Using TDataGrid
+Using TDataGrid
-Automatically Generated Columns
+Automatically Generated Columns
Manually Specified Columns
+Manually Specified Columns
Interacting with TDataGrid
+Interacting with TDataGrid
Sorting
+Sorting
Paging
+Paging
Custom Paging
+Custom Paging
Besides traditional class inheritance, extensibility of TDataGrid is mainly through developing new datagrid column components. For example, one may want to display an image column. He may use TTemplateColumn to accomplish this task. A better solution is to develop an image column component so that the work can be reused easily in other projects.
diff --git a/demos/quickstart/protected/pages/Controls/DataList.page b/demos/quickstart/protected/pages/Controls/DataList.page index 9d904870..c1ff1147 100644 --- a/demos/quickstart/protected/pages/Controls/DataList.page +++ b/demos/quickstart/protected/pages/Controls/DataList.page @@ -1,6 +1,6 @@TDataList is used to display or modify a list of data items specified by its DataSource or DataSourceID property. Each data item is displayed by a data list item which is a child control of the data list. The Items property contains the list of all data list items.
diff --git a/demos/quickstart/protected/pages/Controls/DatePicker.page b/demos/quickstart/protected/pages/Controls/DatePicker.page index 17d28382..a37ff048 100644 --- a/demos/quickstart/protected/pages/Controls/DatePicker.page +++ b/demos/quickstart/protected/pages/Controls/DatePicker.page @@ -1,6 +1,6 @@TDatePicker displays a text box for date input purpose.
diff --git a/demos/quickstart/protected/pages/Controls/Expression.page b/demos/quickstart/protected/pages/Controls/Expression.page
index 80a45a3a..044808c6 100644
--- a/demos/quickstart/protected/pages/Controls/Expression.page
+++ b/demos/quickstart/protected/pages/Controls/Expression.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/FileUpload.page b/demos/quickstart/protected/pages/Controls/FileUpload.page
index 8aa5a0fb..404a144e 100644
--- a/demos/quickstart/protected/pages/Controls/FileUpload.page
+++ b/demos/quickstart/protected/pages/Controls/FileUpload.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/Head.page b/demos/quickstart/protected/pages/Controls/Head.page
index 269ec404..227b5282 100644
--- a/demos/quickstart/protected/pages/Controls/Head.page
+++ b/demos/quickstart/protected/pages/Controls/Head.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/HiddenField.page b/demos/quickstart/protected/pages/Controls/HiddenField.page
index c068d01b..aa2e7c87 100644
--- a/demos/quickstart/protected/pages/Controls/HiddenField.page
+++ b/demos/quickstart/protected/pages/Controls/HiddenField.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/HtmlArea.page b/demos/quickstart/protected/pages/Controls/HtmlArea.page
index 0af685d5..00a65573 100644
--- a/demos/quickstart/protected/pages/Controls/HtmlArea.page
+++ b/demos/quickstart/protected/pages/Controls/HtmlArea.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/HyperLink.page b/demos/quickstart/protected/pages/Controls/HyperLink.page
index afccd041..9fa6bde3 100644
--- a/demos/quickstart/protected/pages/Controls/HyperLink.page
+++ b/demos/quickstart/protected/pages/Controls/HyperLink.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/Image.page b/demos/quickstart/protected/pages/Controls/Image.page
index a926c204..1e8df3de 100644
--- a/demos/quickstart/protected/pages/Controls/Image.page
+++ b/demos/quickstart/protected/pages/Controls/Image.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/ImageButton.page b/demos/quickstart/protected/pages/Controls/ImageButton.page
index b4a8de93..a79ecb6a 100644
--- a/demos/quickstart/protected/pages/Controls/ImageButton.page
+++ b/demos/quickstart/protected/pages/Controls/ImageButton.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/ImageMap.page b/demos/quickstart/protected/pages/Controls/ImageMap.page
index 997faad6..002861a3 100644
--- a/demos/quickstart/protected/pages/Controls/ImageMap.page
+++ b/demos/quickstart/protected/pages/Controls/ImageMap.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/InlineFrame.page b/demos/quickstart/protected/pages/Controls/InlineFrame.page
index 56e3f382..efd5144d 100644
--- a/demos/quickstart/protected/pages/Controls/InlineFrame.page
+++ b/demos/quickstart/protected/pages/Controls/InlineFrame.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/JavascriptLogger.page b/demos/quickstart/protected/pages/Controls/JavascriptLogger.page
index cff2b7aa..ccb4a27b 100644
--- a/demos/quickstart/protected/pages/Controls/JavascriptLogger.page
+++ b/demos/quickstart/protected/pages/Controls/JavascriptLogger.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/Label.page b/demos/quickstart/protected/pages/Controls/Label.page
index 69329c8a..b7d5b094 100644
--- a/demos/quickstart/protected/pages/Controls/Label.page
+++ b/demos/quickstart/protected/pages/Controls/Label.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/LinkButton.page b/demos/quickstart/protected/pages/Controls/LinkButton.page
index eb22f9ce..e0255141 100644
--- a/demos/quickstart/protected/pages/Controls/LinkButton.page
+++ b/demos/quickstart/protected/pages/Controls/LinkButton.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/List.page b/demos/quickstart/protected/pages/Controls/List.page
index cac07330..b5915693 100644
--- a/demos/quickstart/protected/pages/Controls/List.page
+++ b/demos/quickstart/protected/pages/Controls/List.page
@@ -1,6 +1,6 @@
List controls covered in this section all inherit directly or indirectly from TListControl. Therefore, they share the same set of commonly used properties, including,
TListBox displays a list box that allows single or multiple selection. Set the property SelectionMode as Single to make a single selection list box, and Multiple a multiple selection list box. The number of rows displayed in the box is specified via the Rows property value.
TDropDownList displays a dropdown list box that allows users to select a single option from a few prespecified ones.
TCheckBoxList displays a list of checkboxes on a Web page. The alignment of the text besides each checkbox can be specified TextAlign. The layout of the checkboxes can be controlled by the following properties:
TRadioButtonList is similar to TCheckBoxList in every aspect except that each TRadioButtonList displays a group of radiobuttons. Only one of the radiobuttions can be selected (TCheckBoxList allows multiple selections.)
TBulletedList displays items in a bullet format on a Web page. The style of the bullets can be specified by BulletStyle. When the style is CustomImage, the bullets are displayed as images, which is specified by BulletImageUrl.
diff --git a/demos/quickstart/protected/pages/Controls/MultiView.page b/demos/quickstart/protected/pages/Controls/MultiView.page
index 7e566181..a22711b6 100644
--- a/demos/quickstart/protected/pages/Controls/MultiView.page
+++ b/demos/quickstart/protected/pages/Controls/MultiView.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/NewControl.page b/demos/quickstart/protected/pages/Controls/NewControl.page
index 51d0cc02..8f4b9be9 100644
--- a/demos/quickstart/protected/pages/Controls/NewControl.page
+++ b/demos/quickstart/protected/pages/Controls/NewControl.page
@@ -1,6 +1,6 @@
Writing new controls is often desired by advanced programmers, because they want to reuse the code that they write for dealing with complex presentation and user interactions.
Composition is the easiest way of creating new controls. It mainly involves instantiating existing controls, configuring them and making them the constituent components. The properties of the constituent components are exposed through subproperties.
We need two files: a control class file named LabeledTextBox.php and a control template file named LabeledTextBox.tpl. Both must reside under the same directory.
For a composite control as simple as LabeledTextBox, it is better to create it by extending TCompositeControl and overriding the createChildControls() method, because it does not use templates and thus saves template parsing time.
To use LabeledTextBox control, first we need to include the corresponding class file. Then in a page template, we can write lines like the following,
Extending existing controls is the same as conventional class inheritance. It allows developers to customize existing control classes by overriding their properties, methods, events, or creating new ones.
TControl is the base class of all control classes. Two methods are of the most importance for derived control classes:
TWebControl is mainly used as a base class for controls representing HTML elements. It provides a set of properties that are common among HTML elements. It breaks the TControl::render() into the following methods that are more suitable for rendering an HTML element:
If a control wants to respond to client-side events and translate them into server side events (called postback events), such as TButton, it has to implement the IPostBackEventHandler interface.
diff --git a/demos/quickstart/protected/pages/Controls/PlaceHolder.page b/demos/quickstart/protected/pages/Controls/PlaceHolder.page
index 323b1d52..b55d1616 100644
--- a/demos/quickstart/protected/pages/Controls/PlaceHolder.page
+++ b/demos/quickstart/protected/pages/Controls/PlaceHolder.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/RadioButton.page b/demos/quickstart/protected/pages/Controls/RadioButton.page
index 5e1d9d21..b40f37bd 100644
--- a/demos/quickstart/protected/pages/Controls/RadioButton.page
+++ b/demos/quickstart/protected/pages/Controls/RadioButton.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/Repeater.page b/demos/quickstart/protected/pages/Controls/Repeater.page
index c40517f3..795e27aa 100644
--- a/demos/quickstart/protected/pages/Controls/Repeater.page
+++ b/demos/quickstart/protected/pages/Controls/Repeater.page
@@ -1,6 +1,6 @@
TRepeater displays its content defined in templates repeatedly based on the given data specified by the DataSource or DataSourceID property. The repeated contents can be retrieved from the Items property. Each item is created by instantiating a template and each is a child control of the repeater.
diff --git a/demos/quickstart/protected/pages/Controls/Statements.page b/demos/quickstart/protected/pages/Controls/Statements.page
index dd26ec1b..3f3bd1fc 100644
--- a/demos/quickstart/protected/pages/Controls/Statements.page
+++ b/demos/quickstart/protected/pages/Controls/Statements.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/Table.page b/demos/quickstart/protected/pages/Controls/Table.page
index 75fa3fc1..e0f5586e 100644
--- a/demos/quickstart/protected/pages/Controls/Table.page
+++ b/demos/quickstart/protected/pages/Controls/Table.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/TextBox.page b/demos/quickstart/protected/pages/Controls/TextBox.page
index 64cb826a..b4d1576f 100644
--- a/demos/quickstart/protected/pages/Controls/TextBox.page
+++ b/demos/quickstart/protected/pages/Controls/TextBox.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/TextHighlighter.page b/demos/quickstart/protected/pages/Controls/TextHighlighter.page
index 40806b02..285a6f3e 100644
--- a/demos/quickstart/protected/pages/Controls/TextHighlighter.page
+++ b/demos/quickstart/protected/pages/Controls/TextHighlighter.page
@@ -1,6 +1,6 @@
diff --git a/demos/quickstart/protected/pages/Controls/Validation.page b/demos/quickstart/protected/pages/Controls/Validation.page
index 6d83af3d..a28c8faf 100644
--- a/demos/quickstart/protected/pages/Controls/Validation.page
+++ b/demos/quickstart/protected/pages/Controls/Validation.page
@@ -1,6 +1,6 @@
Validation controls, called validators, perform validation on user-entered data values when they are post back to the server. The validation is triggered by a postback control, such as a TButton, a TLinkButton or a TTextBox (under AutoPostBack mode) whose CausesValidation property is true.
@@ -32,14 +32,14 @@ Validators share a common set of properties, which are defined in the base class
-
TRequiredFieldValidator ensures that the user enters some data in the specified input field. By default, TRequiredFieldValidator will check if the user input is empty or not. The validation fails if the input is empty. By setting InitialValue, the validator can check if the user input is different from InitialValue. If not, the validation fails.
TRegularExpressionValidator verifies the user input against a regular pattern. The validation fails if the input does not match the pattern. The regular expression can be specified by the RegularExpression property. Some commonly used regular expressions include:
TCompareValidator compares the user input with a constant value specified by ValueToCompare, or another user input specified by ControlToCompare. The Operator property specifies how to compare the values, which includes Equal, NotEqual, GreaterThan, GreaterThanEqual, LessThan and LessThanEqual. Before comparison, the values being compared will be converted to the type specified by DataType listed as follows,
TDataTypeValidator verifies if the input data is of specific type indicated by DataType. The data types that can be checked against are the same as those in TCompareValidator.
TRangeValidator verifies whether an input value is within a specified range. TRangeValidator uses three key properties to perform its validation. The MinValue and MaxValue properties specify the minimum and maximum values of the valid range. The DataType property specifies the data type of the value being validated. The value will be first converted into the specified type and then compare with the valid range. The data types that can be checked against are the same as those in TCompareValidator.
TCustomValidator performs user-defined validation (either server-side or client-side or both) on an input control.
TValidationSummary displays a summary of validation errors inline on a Web page, in a message box, or both.
TWizard is analogous to the installation wizard commonly used to install software on Windows. It splits a large form and presents the user with a series of smaller forms, called wizard steps, to complete. The following figure shows how a wizard is composed of when presented to users, where step content is the main content of a wizard step for users to complete, header refers to header content common to all steps, navigation contains buttons that allow users to navigate step by step, and side bar contains a list of hyperlinks by which users can reach to any step with one click. The visibility of the side bar can be toggled by setting ShowSideBar.
In this sample, we use wizard to collect user's preference of color. In the first step, the user is presented with a dropdown list from which he can choose hist favorite color. In the second step, the complete step, his choice in the previous step is displayed. In real application, at this step the choice may be stored in database in the backend.
TWizard defines a whole set of properties for customization of appearance of its various components as shown in the above figure. In particular, the following properties are provided for style customization:
Given a set of wizard steps, TWizard supports three different ways of navigation among them:
TWizard supports more concrete control of its outlook through templating. In particular, it provides the following template properties that allow complete customization of the wizard's header, navigation and side bar.
Wizard steps can also be templated. By using TTemplatedWizardStep, one can customize step content and navigation through its ContentTemplate and NavigationTemplate properties, respectively. This is useful for control developers to build specialized wizards, such as user registration, shopping carts, etc.
TExpression
+TExpression
TFileUpload
+TFileUpload
THead
+THead
THiddenField
+THiddenField
THtmlArea
+THtmlArea
THyperLink
+THyperLink
TImage
+TImage
TImageButton
+TImageButton
TImageMap
+TImageMap
TInlineFrame
+TInlineFrame
TJavascriptLogger
+TJavascriptLogger
TLabel
+TLabel
TLinkButton
+TLinkButton
List Controls
+List Controls
TListBox
+TListBox
TDropDownList
+TDropDownList
TCheckBoxList
+TCheckBoxList
TRadioButtonList
+TRadioButtonList
TBulletedList
+TBulletedList
TLiteral
+TLiteral
TMultiView
+TMultiView
Writing New Controls
+Writing New Controls
Composition of Existing Controls
+Composition of Existing Controls
Composition by Writing Templates
+Composition by Writing Templates
Composition by Overriding createChildControls()
+Composition by Overriding createChildControls()
Using LabeledTextBox
+Using LabeledTextBox
Extending Existing Controls
+Extending Existing Controls
Extending TControl
+Extending TControl
Extending TWebControl
+Extending TWebControl
Creating Controls with Special Functionalities
+Creating Controls with Special Functionalities
TPanel
+TPanel
TPlaceHolder
+TPlaceHolder
TRadioButton
+TRadioButton
TRepeater
+TRepeater
TSafeHtml
+TSafeHtml
TStatements
+TStatements
TTable
+TTable
TTextBox
+TTextBox
TTextHighlighter
+TTextHighlighter
Validation Controls
+Validation Controls
TRequiredFieldValidator
+TRequiredFieldValidator
TRegularExpressionValidator
+TRegularExpressionValidator
TCompareValidator
+TCompareValidator
TDataTypeValidator
+TDataTypeValidator
TRangeValidator
+TRangeValidator
TCustomValidator
+TCustomValidator
TValidationSummary
+TValidationSummary
TWizard
+TWizard
Overview
+Overview
Using TWizard
+Using TWizard
-A Single-Step Wizard Sample
+A Single-Step Wizard Sample
Customizing Wizard Styles
+Customizing Wizard Styles
Customizing Wizard Navigation
+Customizing Wizard Navigation
Using Templates in Wizard
+Using Templates in Wizard
Using Templated Wizard Steps
+Using Templated Wizard Steps