2012-10-04 33 views
0

好的,所以我需要將每個輸入從文本框中保存到一個會話變量中。問題是這是動態的,這意味着texbox ID是NatureTextbox_1,NatureTexbox_2等。由於texbox的可用量很少,這使得很難保存每個會話變量。我一直在試圖解決這個問題,並且試圖成爲一個noob並且詢問你們的建議。如果你能給我任何關於該怎麼做的信息,我會很感激。在動態texbox中使用會話

這是C#代碼(記住文本框的是動態的意思是無限的):

protected void Page_Load(object sender, EventArgs e) 
{ 
    // Add any controls that have been previously added dynamically 

    for (int i = 0; i < TotalNumberAdded; ++i) 
    { 
     AddControls(i + 1); 
    } 

} 
private void AddControls(int controlNumber) 
{ 




    var newPanel = new Panel(); 
    var natureLabel = new Label(); 
    var dateLabel = new Label(); 
    var fatalLabel = new Label(); 
    var injurLabel = new Label(); 
    var natureTextbox = new TextBox(); 
    var dateTextbox = new TextBox(); 
    var fatalTextbox = new TextBox(); 
    var injurTextbox = new TextBox(); 

    //Validations 

    var dateRegex = new RegularExpressionValidator(); 

    //*****CURRENT IDEA THAT ISNT WORKING*********************************** 
    Session["Nature" + (TotalNumberAdded - 1)] = natureTextbox.Text.ToString(); 
    Session["Date" + (TotalNumberAdded - 1)] = dateTextbox.Text.ToString(); 
    Session["Fatal" + (TotalNumberAdded - 1)] = fatalTextbox.Text.ToString(); 
    Session["injury" + (controlNumber - 1)] = injurTextbox.Text.ToString(); 
    //********************************************************************** 

    // textbox needs a unique id to maintain state information 
    natureTextbox.ID = "NatureTextBox_" + controlNumber; 
    dateTextbox.ID = "DateTextbox_" + controlNumber; 
    fatalTextbox.ID = "fatalTextbox_" + controlNumber; 
    injurTextbox.ID = "injurTextbox_" + controlNumber; 

    natureLabel.Text = "Nature Of Accident: "; 
    dateLabel.Text = "Date: "; 
    fatalLabel.Text = "Fatalities: "; 
    injurLabel.Text = "Injuries: "; 

    dateRegex.ID = "DateRegex_" + controlNumber; 
    dateRegex.Text = "Please enter in format MM/DD/YYY"; 
    dateRegex.ValidationExpression = @"^(((0?[1-9]|1[012])/(0?[1-9]|1\d|2[0-8])|(0?[13456789]|1[012])/(29|30)|(0?[13578]|1[02])/31)/(19|[2-9]\d)\d{2}|0?2/29/((19|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(([2468][048]|[3579][26])00)))$"; 
    dateRegex.ControlToValidate = dateTextbox.ID; 




    // add the label and textbox to the panel, then add the panel to the form 
    newPanel.Controls.Add(new LiteralControl("<table><tr>")); 
    newPanel.Controls.Add(new LiteralControl("<br />")); 
    newPanel.Controls.Add(new LiteralControl("<td class='title-text' >")); 
    newPanel.Controls.Add(natureLabel); 
    newPanel.Controls.Add(new LiteralControl("</td><td class='title-text'width='180px'>")); 
    newPanel.Controls.Add(natureTextbox); 
    newPanel.Controls.Add(new LiteralControl("</td><td class='title-text' >")); 
    newPanel.Controls.Add(dateLabel); 
    newPanel.Controls.Add(new LiteralControl("</td><td class='title-text'>")); 
    newPanel.Controls.Add(dateTextbox); 
    newPanel.Controls.Add(new LiteralControl("<br />")); 
    newPanel.Controls.Add(dateRegex); 
    newPanel.Controls.Add(new LiteralControl("</td></tr>")); 

    newPanel.Controls.Add(new LiteralControl("<tr><td class='title-text'>")); 
    newPanel.Controls.Add(fatalLabel); 
    newPanel.Controls.Add(new LiteralControl("</td><td class='title-text'>")); 
    newPanel.Controls.Add(fatalTextbox); 
    newPanel.Controls.Add(new LiteralControl("</td><td class='title-text'>")); 
    newPanel.Controls.Add(injurLabel); 
    newPanel.Controls.Add(new LiteralControl("</td><td class='title-text'>")); 
    newPanel.Controls.Add(injurTextbox); 
    newPanel.Controls.Add(new LiteralControl("</td></tr></table><br /><hr />")); 
    AccidentPlaceHolder.Controls.Add(newPanel); 


} 
protected int TotalNumberAdded 
{ 
    get { return (int)(ViewState["TotalNumberAdded"] ?? 0); } 
    set { ViewState["TotalNumberAdded"] = value; } 


} 




protected void AccidentButton_Click(object sender, EventArgs e) 
{ 
    TotalNumberAdded++; 
    AddControls(TotalNumberAdded); 

} 
protected void PrevPage_Click(object sender, EventArgs e) 
{ 

    Response.Redirect("employment_driversapplication_personalinfo.aspx"); 

} 

}

回答

1

這個工作對我來說,要記住,當您單擊值僅堅持「添加' - 所以我會建議另一個保存按鈕或某些東西來堅持不添加新項目時的值。

public partial class TestRJF2 : System.Web.UI.Page 
{ 
    private IList<TextBox> AddedControls = new List<TextBox>(); 
    protected override void CreateChildControls() 
    { 
     BuildControls(); 
     base.CreateChildControls(); 
    } 

    private void BuildControls() 
    { 
     for (var x = 0; x < TotalNumberAdded; x++) 
     { 
      var id = String.Format("NatureTextBox{0}", x); 
      //Check if control was already added 
      //only create controls that are new for this postback 
      if (AccidentPlaceHolder.FindControl(id) == null) 
      { 
       var textBox = new TextBox() {ID = id}; 
       AccidentPlaceHolder.Controls.Add(textBox); 
       AddedControls.Add(textBox); 
      } 
     } 
    } 

    protected override void OnPreRender(EventArgs e) 
    { 
     foreach (var ctrl in AddedControls) 
     { 
      var key = ctrl.ID.Replace("TextBox", String.Empty); 
      Session[key] = ctrl.Text; 
     } 

     foreach (string session in Session.Keys) 
     { 
      System.Diagnostics.Debug.WriteLine(String.Format("{0} = {1}", session, Session[session])); 
     } 
     base.OnPreRender(e); 
    } 

    protected void AccidentButton_Click(object sender, EventArgs e) 
    { 
     TotalNumberAdded++; 
     BuildControls(); 
    } 
    protected int TotalNumberAdded 
    { 
     get { return (int)(ViewState["TotalNumberAdded"] ?? 0); } 
     set { ViewState["TotalNumberAdded"] = value; } 
    } 
} 
+0

我打算這樣做,「下一步」按鈕,當他們去到下一個頁面 – user1574685

+0

也該代碼是在我頭上的方式......我還挺小白本,並不太清楚什麼布萊恩on – user1574685

+0

您的代碼距離您不是100萬英里,但您創建控件時無法將值保存到會話中,因爲該值尚未從'ViewState'填充,所以在'OnPreRender'中也是如此檢查控件是否已添加,因爲您正在將它們重新添加到「Page_Load」中,並再次在click事件處理程序中添加它們。 –