2012-01-11 7 views
2

ユーザーコントロール(.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イベントの初期化コードが必ずしも必要ではありません。

+0

これは、LoadOrderWizard **でサマリーページ**に値を渡しているようです。if(!IsPostBack) { this.NrOfOptions = colOptions.Count; } if(IsPostBack) { CreateDynamicBoxes();私はLoadOrderWizard方法は、Page_Loadイベントで呼び出す必要がありますように動作しません、残念ながら「前の」 – kolin

答えて

0

をPage_Initする)(CreateDynamicBoxesを移動してみてください、私は、ダイナミックなボックスのIDを格納するためにセッション変数を使用して終了していますと値が含まれています。私は他のページで、テキストボックスIDがセッション内に含まれているかどうかを確認し、ボックスにその値を復元します。

数字だけがこのボックスに入れますように、このソリューションは、私のための回避策です。しかし、別の解決方法があるかどうかを知ることは、まだ素晴らしいことです。

0

は、私はこれを実行可能な解決策を見つけることができなかったため、最終的には

protected void Page_Init(object sender, EventArgs e) 
{ 
    CreateDynamicBoxes(); 
} 
+0

をクリックすると は} 'しかしバックボックスに値をリロードされていません。colOptions(CreateDynamicBoxes)は初期化されておらず、例外をスローします。 – kolin

関連する問題