ユーザーコントロール(.ascx)ファイルの一部であるウィザードでポストバック間のテキストボックスコントロールの値の状態を維持しようとすると、 。C#。ウィザードコントロールを使用してダイナミックボックスからコントロール状態を維持する
いくつかの背景
これは、異なるオプションを持つことができ、製品の注文フォーム(1つの製品は多くのオプションを持つことができる)ので、選択肢はジェネリックではありません。 オプションのリスト(SubSonic 2を使用してデータベースから取得)は、選択された製品のウィザードの「開始」段階で、「OptionBox-4」という構文を使用してユーザーに表示されます。データベース内のオプションのIDだから私は後で戻って説明をつかむことができます。
ユーザーは、その後の各オプションで異なる数量を入力することができます。
問題
ユーザーかつてボックスに数量を入力し、「次へ」を押すと、値はポストバックとコントロールのIDの間に格納されません。
コード
<asp:Wizard ID="Wizard1" runat="server" ActiveStepIndex="0"
DisplaySideBar="False" onnextbuttonclick="Wizard1_NextButtonClick"
onpreviousbuttonclick="Wizard1_PreviousButtonClick"
FinishCompleteButtonText="Submit request"
onfinishbuttonclick="Wizard1_FinishButtonClick"
onactivestepchanged="Wizard1_ActiveStepChanged"
onprerender="Wizard1_PreRender" >
<FinishPreviousButtonStyle CssClass="subbutton" />
<FinishCompleteButtonStyle CssClass="subbutton" />
<StartNextButtonStyle CssClass="subbutton" />
<StepNextButtonStyle CssClass="subbutton" />
<StepPreviousButtonStyle CssClass="subbutton" />
<WizardSteps>
<asp:WizardStep runat="server" StepType="Start" title="Description" ID="vgStep1">
<fieldset class="emailform">
<ul runat="server" id="optionList">
<asp:PlaceHolder id="DynamicBoxes" runat="server" />
</ul>
</fieldset>
</asp:WizardStep>
<asp:WizardStep ID="WizardStep1" runat="server" Title="Your details" StepType="Finish">
<h3>Order summary</h3>
<asp:Literal ID="ltlSummary" runat="server"></asp:Literal>
</asp:WizardStep>
<asp:WizardStep ID="WizardStep2" runat="server" StepType="Complete" Title="Thank you">
</asp:WizardStep>
</WizardSteps>
</asp:Wizard>
関連する分離コード
class ResponseCollection : List<string> { }
private int? NrOfOptions
{
get { return (int?)ViewState["NrOfOptions"]; }
set { ViewState["NrOfOptions"] = value; }
}
public PartnerProductOrderableOptionCollection colOptions;
public PartnerProductOrderable prodOrderable;
protected void Page_Load(object sender, EventArgs e)
{
LoadOrderWizard(Utility.GetPartnerProductId(Request.QueryString["ppid"]));
CreateDynamicBoxes();
}
#region Ordering wizard
private void LoadOrderWizard(int p)
{
partnerProduct = new PartnerProduct(p);
prodOrderable = new PartnerProductOrderable("PartnerProductId", p);
colOptions = new PartnerProductOrderableOptionCollection();
colOptions.LoadAndCloseReader(PartnerProductOrderableOption.FetchByParameter("OrderableId", prodOrderable.OrderableId, OrderBy.Asc("ListOrder")));
if (!IsPostBack)
{
this.NrOfOptions = colOptions.Count;
}
}
protected void Wizard1_ActiveStepChanged(object sender, EventArgs e)
{
if (Wizard1.ActiveStepIndex == 1)
{
ResponseCollection responses = CollectValuesFromDynamicBoxes();
ltlSummary.Text += "Controls:";
foreach (Control c in DynamicBoxes.Controls)
{
ltlSummary.Text += c.ID + ",";
if (c is TextBox)
{
ltlSummary.Text += ((TextBox)c).ID + ",";
if (!String.IsNullOrEmpty(((TextBox)c).Text))
{
int optionid = int.Parse(c.ID.Split('-')[1]);
PartnerProductOrderableOption o = new PartnerProductOrderableOption(optionid);
ltlSummary.Text += "<strong>Quantity: </strong>" + ((TextBox)c).Text + "<br />";
ltlSummary.Text += "<strong>Description: </strong>" + o.Description + " - " + o.Price + "<hr />";
}
}
}
}
}
protected void Wizard1_PreviousButtonClick(object sender, WizardNavigationEventArgs e)
{
}
protected void Wizard1_FinishButtonClick(object sender, WizardNavigationEventArgs e)
{
ResponseCollection responses = CollectValuesFromDynamicBoxes();
}
protected void Wizard1_NextButtonClick(object sender, WizardNavigationEventArgs e)
{
if (e.CurrentStepIndex == 0)
{
int newNumberOfOptions = colOptions.Count;
int? oldNumberOfOptions = this.NrOfOptions;
if (!oldNumberOfOptions.HasValue || newNumberOfOptions != oldNumberOfOptions.Value)
{
this.NrOfOptions = newNumberOfOptions;
CreateDynamicBoxes();
}
}
}
private void CreateDynamicBoxes()
{
if (!this.NrOfOptions.HasValue)
return;
DynamicBoxes.Controls.Clear();
foreach (PartnerProductOrderableOption opt in colOptions)
{
HtmlGenericControl li = new HtmlGenericControl("li");
DynamicBoxes.Controls.Add(li);
TextBox box = new TextBox();
box.ID = "OptionBox-" + opt.OptionId;
box.Width = 40;
box.MaxLength = 6;
li.Controls.Add(box);
Label lblOpt = new Label();
lblOpt.ID = "lblOption-" + opt.OptionId;
lblOpt.Text = opt.Description + " - " + opt.Price;
li.Controls.Add(lblOpt);
}
this.NrOfOptions= colOptions.Count;
}
private ResponseCollection CollectValuesFromDynamicBoxes()
{
ResponseCollection responses = new ResponseCollection();
for (int i = 0; i < this.NrOfOptions.Value; i++)
{
TextBox box = (TextBox)DynamicBoxes.FindControl("OptionBox-" + i);
string response = box.Text.Trim();
if (response.Length > 0)
responses.Add(response);
}
return responses;
}
protected void Wizard1_PreRender(object sender, EventArgs e)
{
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
}
#endregion
コードが緩く、私は私が何をする必要があるかと非常によく似た何かを思われるhttp://aspnetresources.com/blog/dynamic_text_bBoxes_in_wizard_controlに基づいています。
別のノート
LoadOrderWizard方法は、Page_Loadイベントに呼ばれることがあります。これは、私の問題に関連するコードだけが表示されています。コントロールは実際にはコントロールに渡されるデータに基づいて異なる情報を表示するいくつかの異なるパネルで構成されています。そのため、Page_Initイベントの初期化コードが必ずしも必要ではありません。
これは、LoadOrderWizard **でサマリーページ**に値を渡しているようです。if(!IsPostBack) { this.NrOfOptions = colOptions.Count; } if(IsPostBack) { CreateDynamicBoxes();私はLoadOrderWizard方法は、Page_Loadイベントで呼び出す必要がありますように動作しません、残念ながら「前の」 – kolin