Вопрос по asp.net, dynamically-generated, c#, textbox – получить значения из динамически добавленных текстовых полей asp.net c #

7

как предложено в заголовке, в котором я могу вставить, сколько текстовых полей я хочу добавить в заполнитель. я могу просто добавить текстовые поля, проблема в том, что я не могу получить значения, вставленные в эти динамически добавленные текстовые поля. вот мой код

Цель этого фрагмента кода - всякий раз, когда текстовое поле, в котором я могу ввести желаемое количество текстовых полей. он создает и добавляет их в заполнитель на моей странице.

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);
    }
}

это код кнопки, которая отправит и ответит. запишите значения, вставленные во все эти текстовые поля.

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);  
         } 
     }
 }

Я искал в Интернете, и я получил ответы, что этот код в порядке, и он должен работать, но это не так. если вы, ребята, видите что-то не так или у вас есть предложения, которые могут решить мою проблему, я был бы очень признателен

Как это не подведет? txtExtra.text. Я думал, что C # чувствителен к регистру. attila
это было ошибкой, вставляя это здесь. в коде все нормально. aconstancio
Немного о том, что «вставка» вашего кода меняет дело. Это приводит к тому, что отвечающие задаются вопросом, что еще изменилось с вашей вставкой attila

Ваш Ответ

3   ответа
2

установленным в default = ""; Так что вам нужно установить свойство txt.Text, например:

    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);

        }
    }

РЕДАКТИРОВАТЬ:

После этого вы можете сохранить ваши значения в списке:

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
            }
        }
    }

РЕДАКТИРОВАТЬ: Вот ваши ценности:

РЕДАКТИРОВАТЬ: Для лучшего понимания: создайте еще одно текстовое полеtxtOutput затем добавить кнопкуGetDataFromTextBoxesAndPutItBelow и создайте событие для этой кнопки `Click '. Код события:

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

Скриншот выглядит:

Значения списка <string> не содержат элементов? Не может быть xD Wallstrider
попробовал это. не работает: / aconstancio
после того, как я нажму кнопку, ничего не происходит. как и раньше с моим исходным кодом aconstancio
Что вы ожидали?my objective is to get the values introduced in the textboxes? Вы проверили список <string> значений? Он содержит все значения, которые имеют ваши текстовые поля. Дайте мне знать, если коллекция пуста. Попробуйте точки останова и т. Д. Wallstrider
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);

}
4

проблема

Вам необходимо перезагрузить эти динамически созданные текстовые поля на пост обратно. В противном случае они станут нулевыми, и вы не сможете его найти.

Чтобы сделать это, вам нужно сохранить эти динамически идентификаторы TextBoxes в постоянном месте, таком как View State или Session State.

Скриншот

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"/>
Код позади
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;
        }
    }
}
Это решение действительно легко выжимается. XD Wallstrider

Похожие вопросы