2013-12-11 42 views
0

我從使用linkbutton添加的某些文本框中獲取字符串時遇到了一些問題。此代碼可以通過單擊鏈接按鈕添加文本框,並將這些文本框添加到面板上,但我不知道如何獲取用戶在添加的這些文本框中寫入的字符串,也無法保留字符串寫在文本框中,當我點擊linkbutton添加一個文本框。你能幫我嗎?這裏是我的代碼:從C#中的文本框中獲取字符串asp.net

public partial class _Default : Page 
{ 
    Label myLabel1; 
    Label myLabel2; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     myLabel1 = new Label(); 
     myLabel2 = new Label(); 
     Panel1.Controls.Add(myLabel1); 
     Panel2.Controls.Add(myLabel2); 
     if (!Page.IsPostBack) 
     { 
      //Remove the session when first time page loads. 
      Session.Remove("clicks"); 
      Session.Remove("clicks2"); 
     } 

    } 
    private void BuildTextBoxes(int rowCount1, int rowCount2) 
    { 
     for (int i = 0; i < rowCount1; i++) 
     { 
      TextBox TxtBoxU = new TextBox(); 
      TxtBoxU.ID = "TextBoxU" + i.ToString(); 
      //Add the labels and textboxes to the Panel. 
      Panel1.Controls.Add(TxtBoxU); 
     } 

     myLabel1.Text = rowCount1 + ""; 

     for (int i = 0; i < rowCount2; i++) 
     { 
      TextBox TxtBoxU = new TextBox(); 
      TxtBoxU.ID = "TextBoxU" + i.ToString(); 
      //Add the labels and textboxes to the Panel. 
      Panel2.Controls.Add(TxtBoxU); 
     } 

     myLabel2.Text = rowCount2 + ""; 
    } 

    protected void LinkButton1_Click(object sender, EventArgs e) 
    { 
     int rowCount1 = 0; 
     //initialize a session. 
     rowCount1 = Convert.ToInt32(Session["clicks"]); 
     rowCount1++; 
     //In each button clic save the numbers into the session. 
     Session["clicks"] = rowCount1; 
     BuildTextBoxes(rowCount1, Convert.ToInt32(Session["clicks2"])); 

    } 

    protected void LinkButton2_Click(object sender, EventArgs e) 
    { 
     int rowCount2 = 0; 
     //initialize a session. 
     rowCount2 = Convert.ToInt32(Session["clicks2"]); 
     rowCount2++; 
     //In each button clic save the numbers into the session. 
     Session["clicks2"] = rowCount2; 
     BuildTextBoxes(Convert.ToInt32(Session["clicks"]), rowCount2); 
    } 

} 

非常感謝。

回答

3

有跡象表明,你需要做的幾件事情。由於您正在動態生成這些文本框,因此每次頁面處理時(甚至是回發)都需要生成它們。它們還需要在視圖狀態加載之前生成。

每次加載頁面時,都需要在面板中重新創建文本框,這應該發生在page_init函數中(需要在加載視圖狀態之前發生)。

有關ASP.Net頁生命週期的詳細信息: ASP.NET Page Life Cycle Overview

下面的代碼是什麼,我認爲你正在尋找:

Label myLabel1; 
Label myLabel2; 

/// <summary> 
/// Add the dynamic controls to the page before the viewstate is 
/// </summary> 
/// <param name="sender"></param> 
/// <param name="e"></param> 
protected void page_init(object sender, EventArgs e) 
{  
    myLabel1 = new Label(); 
    myLabel2 = new Label(); 
    Panel1.Controls.Add(myLabel1); 
    Panel2.Controls.Add(myLabel2); 

    var box1Count = 0; 
    box1Count = Convert.ToInt32(Session["clicks"]); 

    var box2Count = 0; 
    box2Count = Convert.ToInt32(Session["clicks2"]); 

    BuildTextBoxes(box1Count, box2Count); 
} 

/// <summary> 
/// Ensure first time loads properly setup the page. 
/// </summary> 
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
    //Remove the session when first time page loads. 
    Session.Remove("clicks"); 
    Session.Remove("clicks2"); 

    //Set the Text Boxes and lables to zero. 
    BuildTextBoxes(0, 0); 
    } 
} 

/// <summary> 
/// Add any new text boxes to the screen. 
/// </summary> 
/// <param name="rowCount1">The total number of text boxes in the first group.</param> 
/// <param name="rowCount2">The total number of text boxes in the second group.</param> 
private void BuildTextBoxes(int rowCount1, int rowCount2) 
{ 

    var panel1Count = Panel1.Controls.Count; //Current number of text boxes 
    panel1Count--;        //Remove the Label control from the count 
    for (int i = panel1Count; i < rowCount1; i++) 
    { 
    TextBox TxtBoxU = new TextBox(); 
    TxtBoxU.ID = "TextBox1U" + i.ToString(); //Ensure a globally unique name. 
    Panel1.Controls.Add(TxtBoxU);    //Add the labels and textboxes to the Panel. 
    } 
    myLabel1.Text = rowCount1.ToString(); 

    var panel2Count = Panel2.Controls.Count; //Current number of text boxes 
    panel2Count--;        //Remove the Label control from the count 
    for (int i = panel2Count; i < rowCount2; i++) 
    { 
    TextBox TxtBoxU = new TextBox();   
    TxtBoxU.ID = "TextBox2U" + i.ToString(); //Ensure a globally unique name; 
    Panel2.Controls.Add(TxtBoxU);    //Add the labels and textboxes to the Panel. 
    } 
    myLabel2.Text = rowCount2 + ""; 
} 

/// <summary> 
/// Add another textbox to the first group. 
/// </summary> 
protected void LinkButton1_Click(object sender, EventArgs e) 
{ 
    int rowCount1 = 0; 
    //initialize a session. 
    rowCount1 = Convert.ToInt32(Session["clicks"]); 
    rowCount1++; 
    //In each button click save the numbers into the session. 
    Session["clicks"] = rowCount1; 
    BuildTextBoxes(rowCount1, Convert.ToInt32(Session["clicks2"])); 
} 

/// <summary> 
/// Add another textbox to the second group. 
/// </summary> 
protected void LinkButton2_Click(object sender, EventArgs e) 
{ 
    int rowCount2 = 0; 
    //initialize a session. 
    rowCount2 = Convert.ToInt32(Session["clicks2"]); 
    rowCount2++; 
    //In each button clic save the numbers into the session. 
    Session["clicks2"] = rowCount2; 
    BuildTextBoxes(Convert.ToInt32(Session["clicks"]), rowCount2); 
} 
+0

太棒了。就在這個代碼中,當計數器位於4時,它開始添加文本框。你知道這是爲什麼嗎?謝謝 – Albert

3

要閱讀的文本框,你需要做回發如下:

var result = Request.Form["textboxId"] 
+0

你的意思是我必須在受保護的無效Page_Load(object sender,EventArgs e)中添加它嗎?對不起這個問題,我是使用C#的noob。 – Albert

0

+1解釋,這一切都需要在ViewState加載之前發生。如果有人沒有讀過關於無窮大循環的動態控制和文章的Viewstate,我強烈建議他們這樣做: -

Dynamic Controls

Viewstate

兼具優異,並解釋事情到最後的細節。

相關問題