7

as suggested in the title i have in which i can insert how many textboxes i want to add to a placeholder. i can add the textboxes just fine the problem is i cant get the values inserted on those dynamically added textboxes. here's my code

the purpose of this piece of code is to whenever the textbox in which i can introduce the number of textboxes i want. it creates and adds them to the placeholder in my page.

public void txtExtra_TextChanged(object sender, EventArgs e)
{  
    for (a = 1; a <= int.Parse(txtExtra.Text); a++)
    {
         TextBox txt = new TextBox();
         txt.ID = "txtquestion" + a;
         pholder.Controls.Add(txt);
    }
}

this is the code of the button that will submit and response.write the values inserted in all those textboxes.

protected void btnConfirm_Click(object sender, EventArgs e)
{
     foreach (Control ctr in pholder.Controls)
     {
         if (ctr is TextBox)
         {        
              string value = ((TextBox)ctr).Text;
              Response.Write(value);  
         } 
     }
 }

i've been searching online and i've been getting answers that this code is fine and it should work but it doesnt. if you guys see anything wrong or have any suggestion that can solve my problem i'd really appreciate it

3
  • How is this not failing? txtExtra.text. I thought c# was case sensitive. Commented Mar 23, 2014 at 14:41
  • that was a mistake pasting it here. in the code it's fine. Commented Mar 23, 2014 at 14:47
  • It is a little concerning that "pasting" your code changes the case. This leads answerers to wonder what else changed with your pasting. Commented Mar 23, 2014 at 15:46

3 Answers 3

4

You are almost there.

Problem

You need to reload those dynamically created textboxes on post back. Otherwise, they will become null, and you won't be able to find it.

In order to do that, you need to save those dynamically TextBoxes Ids in persistent location such as View State or Session State.

Screen Shot

enter image description here

ASPX

Number of TextBoxes: <asp:TextBox runat="server" ID="CounterTextBox" 
    OnTextChanged="CounterTextBox_TextChanged" AutoPostBack="True" /><br/>
<asp:PlaceHolder runat="server" ID="TextBoxPlaceHolder" /><br/>
<asp:Button runat="server" ID="ConfirmButton" Text="Confirm" 
    OnClick="ConfirmButton_Click" /><br/>
Result: <asp:Literal runat="server" ID="ResultLiteral"/>

Code Behind

private List<string> TextBoxIdCollection
{
    get
    {
        var collection = ViewState["TextBoxIdCollection"] as List<string>;
        return collection ?? new List<string>();
    }
    set { ViewState["TextBoxIdCollection"] = value; }
}

protected void Page_Load(object sender, EventArgs e)
{
    foreach (string textboxId in TextBoxIdCollection)
    {
        var textbox = new TextBox {ID = textboxId};
        TextBoxPlaceHolder.Controls.Add(textbox);
    }
}

protected void CounterTextBox_TextChanged(object sender, EventArgs e)
{
    var collection = new List<string>();
    int total;
    if (Int32.TryParse(CounterTextBox.Text, out total))
    {
        for (int i = 1; i <= total; i++)
        {
            var textbox = new TextBox { ID = "QuestionTextBox" + i };
            // Collect this textbox id
            collection.Add(textbox.ID); 
            TextBoxPlaceHolder.Controls.Add(textbox);
        }
        TextBoxIdCollection= collection;
    }
}

protected void ConfirmButton_Click(object sender, EventArgs e)
{
    foreach (Control ctr in TextBoxPlaceHolder.Controls)
    {
        if (ctr is TextBox)
        {
            string value = ((TextBox)ctr).Text;
            ResultLiteral.Text += value;
        }
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

This solution is really easy peasy lemon squeezy. xD
2

You are actually creating textboxes with property Text set to default = ""; So you need set txt.Text property for example:

    public void txtExtra_TextChanged(object sender, EventArgs e)
    {
        for (int a = 1; a <= int.Parse(txtExtra.Text); a++)
        {
            TextBox txt = new TextBox();
            txt.ID = "txtquestion" + a;
            txt.Text = "Some text"; // Set some text here
            pholder.Controls.Add(txt);

        }
    }

EDIT:

After that you can store your values into the list:

private static List<string> values = new List<string>();

    protected void btnConfirm_Click(object sender, EventArgs e)
    {
        foreach (Control ctr in pholder.Controls)
        {
            if (ctr is TextBox)
            {
                string value = ((TextBox)ctr).Text;
                values.Add(value); // add values here
            }
        }
    }

EDIT: Here is your values: enter image description here

EDIT: For super mega better understanding: Create one more textbox txtOutput then add button GetDataFromTextBoxesAndPutItBelow and create an event for that button `Click'. Event code:

    protected void btnGetData_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < values.Count; i++)
            txtOutput.Text += "Value from txtquestion1: " + values[i] + " ";
    }

Screenshot looks: screen2

5 Comments

my objective is to get the values introduced in the textboxes after their creation. and even if i set text for each textbox when creating i cant get it afterwards. dont know if i explained well
List<string> values don't contain any items? Can't be xD
after i click the button nothing happens. just like before with my initial code
What you expected? my objective is to get the values introduced in the textboxes? did you check List<string> values? It contains all values which your textboxes have. Let me know if the collection is empty. Try breakpoints etc.
EDIT: I added GetDataFromBoxes button and btnGetData_Click event just to make break point and show you screenshot for better understanding.
0
for (int i = 0; i < dataTable.Rows.Count; i++)
{

    int comment_id = Convert.ToInt32(dataTable.Rows[i]["comment_id"]);
    string created_by_name = dataTable.Rows[i]["created_by_name"].ToString();
    string created_at = dataTable.Rows[i]["created_at"].ToString();
    string comment = dataTable.Rows[i]["comment"].ToString();

    HtmlGenericControl divComment = new HtmlGenericControl("div"); //This is root object of comment.Other objects like textbox,button,etc added into this object.
    //divComment.Attributes.Add("class", "div_post_display");
    divComment.Attributes.Add("id", comment_id.ToString());

    /* Comment by */
    HtmlGenericControl lblCommentBy = new HtmlGenericControl("label");
    //lblCommentBy.Attributes.Add("class", "divauthor");
    lblCommentBy.InnerText = "" + created_by_name + " (" + created_at + ")";

    /* Comment body */
    HtmlGenericControl pComment = new HtmlGenericControl("p");
    //lblCommentBy.Attributes.Add("class", "divauthor");
    pComment.InnerText = comment;

    divComment.Controls.Add(lblCommentBy);
    divComment.Controls.Add(pComment);

    if (Session["user_id"] != null)
    {
        if (Session["user_level"].ToString() == "1") //Admin can reply for comment
        {
            /* Reply Form */
            TextBox txtReply = new TextBox(); //Create object dynamacaly
            txtReply.ID = "txtReply_"+comment_id;
            txtReply.Attributes.Add("class", "form-control"); //Add css class
            txtReply.Width = 400;
            divComment.Controls.Add(txtReply); //Add obj to root object(div)

            Button btnReply = new Button(); //Create object dynamacaly
            btnReply.Text = "Reply"; //Set button text 
            btnReply.Attributes.Add("class", "btn btn-sm btn-success"); //Add css class
            btnReply.Click += btnReply_Click;
            btnReply.CommandArgument = comment_id.ToString();
            divComment.Controls.Add(btnReply); //Add obj to root object(div)

            HtmlGenericControl br = new HtmlGenericControl("br"); //Create object dynamacaly
            divComment.Controls.Add(br); //new line
        }
    }
    pnlShowComments.Controls.Add(divComment);

}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.