Beklager ventetiden - jeg har lavet et lille skelet til dig.
Hovedprincipperne er, at du laver en kontrol for hvert trin i din wizard, og du angiver så pr. querystring hvilket trin du ønsker at se.
Der er desuden et navigationspanel som hjælper med at linke mellem trinene.
Du kan så for hvert trin angive opbygning og håndtere events mv.
// aspx-filen
<%@ Page language="c#" Codebehind="Default.aspx.cs" AutoEventWireup="false" Inherits="tchami._Default" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>Default</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="
http://schemas.microsoft.com/intellisense/ie5"> <LINK href="Styles.css" type="text/css" rel="stylesheet">
</HEAD>
<body>
<form id="WizardForm" method="post" runat="server">
</form>
</body>
</HTML>
// cs-filen
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace tchami
{
// definition af hvilke tilstande siden kan være i
public enum PageState
{
Undefined = 0,
WizardStepOne = 1,
WizardStepTwo = 2,
WizardStepThree = 3
}
public class _Default : System.Web.UI.Page
{
// formen på siden
protected HtmlForm WizardForm;
// property til at suge pagestate fra querystring
protected PageState CurrentPageState
{
get
{
try
{
return (PageState)Enum.Parse(typeof(PageState), Request.QueryString["PageState"], true);
}
catch
{
return PageState.WizardStepOne;
}
}
}
// kan give næste trin
protected PageState NextPageState
{
get
{
if(Enum.IsDefined(typeof(PageState), ((int)CurrentPageState)+1))
return (PageState)((int)CurrentPageState)+1;
else
return PageState.Undefined;
}
}
// kan give forrige trin
protected PageState PreviousPageState
{
get
{
if(Enum.IsDefined(typeof(PageState), ((int)CurrentPageState)-1))
return (PageState)((int)CurrentPageState)-1;
else
return PageState.Undefined;
}
}
// sørger for at få indsat den rigtige type kontrol
private void Page_Load(object sender, System.EventArgs e)
{
WizardStep step = null;
switch(CurrentPageState)
{
case PageState.WizardStepOne :
step = new StepOne();
break;
case PageState.WizardStepTwo :
step = new StepTwo();
break;
case PageState.WizardStepThree :
step = new StepThree();
break;
default :
break;
}
if(step != null)
{
step.CssClass = "wizardStep";
WizardForm.Controls.Add(step);
InserNavigationPanel();
}
}
// for opbygning af navigationspanel
private void InserNavigationPanel()
{
HyperLink hl = null;
Table table = new Table();
table.CssClass = "navigationPanel";
TableRow tr = new TableRow();
table.Rows.Add(tr);
TableCell tc = new TableCell();
tc.HorizontalAlign = HorizontalAlign.Left;
if(PreviousPageState != PageState.Undefined)
{
hl = new HyperLink();
hl.NavigateUrl = Request.Path + "?PageState=" + PreviousPageState;
hl.Text = "<<--";
tc.Controls.Add(hl);
}
tr.Cells.Add(tc);
tc = new TableCell();
tc.HorizontalAlign = HorizontalAlign.Right;
if(NextPageState!= PageState.Undefined)
{
hl = new HyperLink();
hl.NavigateUrl = Request.Path + "?PageState=" +NextPageState;
hl.Text = "-->>";
tc.Controls.Add(hl);
}
tr.Cells.Add(tc);
WizardForm.Controls.Add(table);
}
// standard
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
// standard
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
}
// base for alle trin
public class WizardStep : WebControl, INamingContainer
{
}
public class StepOne : WizardStep
{
// kontroller til step1
protected Label lblText;
protected TextBox txtText;
protected Button btnButton;
protected override void OnInit(EventArgs e)
{
lblText = new Label();
lblText.Text = this.GetType().Name;
txtText = new TextBox();
btnButton = new Button();
btnButton.Click += new EventHandler(btnButton_Click);
base.OnInit (e);
}
protected override void CreateChildControls()
{
Controls.Add(lblText);
Controls.Add(new LiteralControl("<br>"));
Controls.Add(txtText);
Controls.Add(btnButton);
base.CreateChildControls ();
}
private void btnButton_Click(object sender, EventArgs e)
{
this.txtText.Text = "KLIK !";
}
}
public class StepTwo : WizardStep
{
// kontroller til step2
protected DropDownList ddList;
protected override void OnInit(EventArgs e)
{
ddList = new DropDownList();
ddList.Items.Add(new ListItem("Hej","0"));
ddList.Items.Add(new ListItem("med","1"));
ddList.Items.Add(new ListItem("dig","2"));
base.OnInit (e);
}
protected override void CreateChildControls()
{
Controls.Add(ddList);
base.CreateChildControls ();
}
}
public class StepThree : WizardStep
{
// kontroller til step3
protected Calendar calDates;
protected override void OnInit(EventArgs e)
{
calDates = new Calendar();
base.OnInit (e);
}
protected override void CreateChildControls()
{
Controls.Add(calDates);
base.CreateChildControls ();
}
}
}
Jeg håber du kan bruge idéen til noget...
Hvis der er noget omkring det du er i tvivl siger du bare til.
Jeg er klar over at der i eksemplet IKKE er vist noget med hvordan du samler værdier op i forbindelse med navigering osv, men der er ikke nogle problemer i at lægge ind, og jeg gør det gerne, hvis du gerne vil arbejde videre med ovenstående model.
Desuden gemmes bruges eventuelle indtastninger heller ikke ved navigering, men det er der heller ikke noget problem i at udvide med.
(men så skal vi nok have lidt på banen omkring hvad der skal ske med det :o)
Mvh