Bildiğimiz gibi web tarafında ,kullanıcıdan bazen bibiri ile ilşkili veriler toplamak amacıyla bir dizi form tasarlanır.Bu formlar arasında gerekli bilgiler transfer edilerek formlar arasındaki ilişki ve tutarlılık sağlanır.Örneğin kullanıcı kayıt formu , sipariş formu ... gibi. Bu tür seri işlemlerin aynı form üzerinde bu mantıkla çalışması için ASP.NET 2.0 da Wizard denilen bir kontrol ile tanışacağız.Wizard birçok form aracılığı ile yapılan kullanıcı taraflı bilgileri toplamamızı ve yönetmemizi kolaylaştırmaktadır.
Wizard , steplerden oluşmaktadır.Step bir form olarak düşünülebilir.Aslında Wizard daha önceden de yazmış olduğum MultiView kontrolü içermekte olup her bir step MultiView içinde bulunan View ‘ler olarak düşünülmelidir.Stepler arasında dolaşarak işlem yapabilir ve stepler için spesifik kontroller yazabiliriz.Mesela bir diğer stepte , kullanıcı doğrulaması başarılı olursa işlem bitecek ancak doğrulanamazsa başka bir işlem geçekleştirilecekse bunu yönetmek için kriterler tanımlayabiilrsiniz.
Wizard kontrolü Control class’ ından türetilmekte ve BaseWizarrdStep ‘te View’ den türetülmektedirler.Aşağıdaki şekilde Wizard kontrolünün tüm özellikleri,metodları,child kontrolleri liistelenmiştir. Şekilde de gördüğümüz gibi Wizard kontrolü WizardSteps koleksiyonuna sahiptir.WizardSteps, yazılımcının kullanıcı için geliştirdiği ayrı ayrı arayüzleri (interface) içeren steplerden oluşmaktadır. Wizard kontrolü Header alanına sahiptir ve kullanıcının bulunduğu Step’e özgü bir başlık bilgisi atamak için kullanılabilir.Wizard ayrıca SideBar kontrolüne de sahiptir.Bununla Wizard’ın solunda Step’lerin Title bilgileri ile bir menü oluşturularak , kullanıcının menüdeki linklere tıklayarak istediği işlemi yağmasını sağlayabiliriz.Wizard kontrolünün Properties ‘ lerine bakıldığında tamamıyla özelleştirilebilir olduğunu göreceksiniz.
BaseWizardStep, StepType adlı bir özelliğe (property) sahiptir.Bu özelliğin içerdiklerini şöyle kısaca açıklayalım :
WizardStepType.Auto : Navigasyon yani ilerleme durumu Wizard’da bulunan “Previous” ve “Next” butonları ile sağlanmaktadır. Stepleri Wizard’a sağ tıklayarak “Add/Remove WizardSteps...” kısmından eklediğimizde stepler birer index numarasına sahip olacaktırlar.Dolayısıyla WizardStepType Auto olarak seçilirse , stepler arasındaki geçiş sırası burada bulunan sıralamayı esas alarak gerçekleşecektir. Bu varsayılan (default) değerdir.
WizardStepType.Complete : Stepler arasında son adım olarak seçilmek istenenin WizardStepType ‘ı Complete olarak seçilir.Bu durumda navigation butonlar (prev,next,finish) bu stepte yer almayacaktırlar.
WizardStepType.Finish : Bu da en son adım olup burada sadece “Previous” ve “Finish” butonları yer alır.
WizardStepType.Start : Bu ilk adımdır ve sadece “Next” butonu yer alır.
WizardStepType.Step : Buda start ile finish stepleri arasında bulunur.”Next” ve “Previous” butonları yer alır.

Şekil 1 : Wizard Kontrol Hiyerarşisi
Bu örneğimde Form üzerine ToolBox’ tan seçtiğim bir Wizard yerleştiriyorum ve örnek olarak bilgisayar parçalarını seçebileceğimiz ve sonunda bu seçilen parçaları listeleyebileceğimiz bir örnek yapmış olacağız.
Visual Studio 2005 i açarak FileàNewàWeb Site seçerek “ WizardDemo” adlı ASP.NET Web Site bir proje açalım. ToolBoxtan bir adet Wizard alarak forma bırakalım.Wizard da sağ tıklayarak “Add/Remove WizardSteps..” seçelim ve tek tek Stepleri ekleyelim.Steplerde önemli olan “Title” ve “WizardStepType” özellikleridir.Title , Stepin adı olacaktır ve hem arayüzde hem de kod tarafında (code behind) bu step ile ilgili spesifik işlemler yapmamız için gerekli olacaktır.WizarStepType ise yukarda detaylı olarak açıklandığı üzere hem geçiş sıralaması hem de başlangıç ve sonuç işlemlerini yönetmemiz için gereklidir.Benim uygulama için hazırladıklarım :
Şekil 2 : Step Ekleme
Şimdide Sidebarda ki linklere tıklayarak steplerde bulunacak kontrolleri eklemeye başlayabiliriz.

Step 1 : iki adet Label.

Step 2 : İki adet radiobutton

Step 3 : Dört adet radiobutton

Step 4 : 2 ader radiobutton

Step 5 : 4 adet RadioButton

Step 6 : 2 adet RadioButton

Son Step : Listeleme veya mesaj görüntülemek için bir Label
Header eklemek için , Wizarda sağ tıklayarak “Edit Templates” à “Header Template” seçelim.

Şekil 3 : Header Template Seçimi
Aşağıda da görüldüğü üzere Header Template içerisine bir adet Label koyuyoruz ve istediğinizi “Text” özelliğine yazınız.

Şekil 4 : Header Template Design View
Bunu tamamladıktan sonra sağ tıklayarak “End Edit Template” diyerek işlemlerimize devam ediyoruz.
Wizard için yazdığım kodlar da :
CODE BEHIND :
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
Wizard1.ActiveStepIndex = 0;
}
protected void Wizard1_FinishButtonClick(object sender, WizardNavigationEventArgs e)
{
Wizard1.Visible = false;
if (lblSummary.Text == string.Empty)
{
Response.Write("Thank you for visiting our site.<br /> Maybe next time you will get a new one from us");
}
else
{
Response.Write("<b>Thank you for choosing our products...</b> <br /><br />"
+ "Here is your computer list : <br />"
+ lblSummary.Text);
}
}
protected void Wizard1_NextButtonClick(object sender, WizardNavigationEventArgs e)
{
if (Wizard1.WizardSteps[e.NextStepIndex].Title == "Özet")
{
lblSummary.Text = String.Empty;
foreach (WizardStep ws in Wizard1.WizardSteps)
{
foreach (Control ctrl in ws.Controls)
{
if (ctrl is RadioButton)
{
if (((RadioButton) ctrl).Checked)
{
lblSummary.Text += ((RadioButton)ctrl).Text + "<br />";
}
}
}
}
}
}
}
Proje çalıştırılıp tüm steplerdeki veriler girildiğinde son step şöyle görünecektir.

Daha sonra Finish butonuna tıklandığında da:

Eğer kullanıcı hiçbir seçim yapmadan, sayfa açıldığında direk “Özet” e tıklarsa :

Buradan da Finish butonuna tıklanınca :

Sonuç olarak Wizard kontrolü, tek form içerisinde biribiri iile ilişkili verileri aynı ekrandan almamazı sağlamaktadır ve de göründüğü üzere hem yönetimi hem de kullanımı çok kolay.