web-dev-qa-db-fra.com

obtenir des valeurs de zones de texte ajoutées dynamiquement asp.net c #

comme suggéré dans le titre que j'ai dans lequel je peux insérer combien de zones de texte que je veux ajouter à un espace réservé. je peux ajouter les zones de texte très bien le problème est que je ne peux pas obtenir les valeurs insérées sur ces zones de texte ajoutées dynamiquement. voici mon code

le but de ce morceau de code est de mettre à chaque fois la zone de texte dans laquelle je peux introduire le nombre de zones de texte que je veux. il les crée et les ajoute à l'espace réservé dans ma 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);
    }
}

c'est le code du bouton qui soumettra et répondra. écrivez les valeurs insérées dans toutes ces zones de texte.

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

j'ai cherché en ligne et j'ai obtenu des réponses à l'effet que ce code est correct et qu'il devrait fonctionner, mais il ne fonctionne pas. si vous voyez quelque chose de mal ou avez une suggestion qui peut résoudre mon problème, je l'apprécierais vraiment

7
aconstancio

Tu es presque là. 

Problème

Vous devez recharger ces zones de texte créées dynamiquement lors de la publication. Sinon, ils deviendront nuls et vous ne pourrez pas le trouver.

Pour ce faire, vous devez enregistrer ces identificateurs TextBoxes de manière dynamique dans des emplacements persistants tels que View State ou Session State.

Capture d'écran

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 derrière

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;
        }
    }
}
4
Win

Vous créez actuellement des zones de texte avec la propriété Text définie sur default = ""; Vous avez donc besoin de la propriété set txt.Text, par exemple:

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

        }
    }

MODIFIER:

Après cela, vous pouvez stocker vos valeurs dans la liste:

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: Voici vos valeurs: enter image description here

EDIT: Pour une meilleure compréhension: Créez une zone de texte supplémentaire txtOutput, puis ajoutez le bouton GetDataFromTextBoxesAndPutItBelow et créez un événement pour ce bouton 'Cliquez'. Code de l'événement:

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

Capture d'écran ressemble: screen2

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

}
0
Lahiru