Obtenir la valeur de la zone de texte ajoutée dynamicment à partir du tableau situé dans le panneau de mise à jour

Ci-dessous sont les contrôles dans aspx.

      

Lorsque le bouton Ajouter est cliqué, je crée un tableau dynamic. Ci-dessous le code C #

 protected void AddTxt(object sender, EventArgs e) { int tblRows = 3; int tblCols = 3; Table tbl = new Table(); for (int i = 0; i < tblRows; i++) { TableRow tr = new TableRow(); for (int j = 0; j < tblCols; j++) { TableCell tc = new TableCell(); TextBox txtBox = new TextBox(); txtBox.ID = "txt" + i.ToString() + j.ToString(); //txtBox.TextChanged += new EventHandler(txt_TextChanged); tc.Controls.Add(txtBox); tr.Cells.Add(tc); if (Session["ctls"] != null) { Session["ctls"] += ";t"; } else { Session["ctls"] = "t"; } } tbl.Rows.Add(tr); } holder.Controls.Add(tbl); panel.Update(); } 

Lorsque la publication partielle se produit en cliquant sur le bouton Actualiser, je ne parviens pas à obtenir la valeur mise à jour par l’utilisateur dans la zone de texte. Les contrôles auront un texte vide.

 protected void Page_Load(object sender, EventArgs e) { foreach (Control c in holder.Controls) { if (c is TextBox) { } } } protected override void OnInit(EventArgs e) { base.OnInit(e); if (Session["ctls"] != null) { ssortingng[] ctls = Session["ctls"].ToSsortingng().Split(';'); foreach (ssortingng ctlType in ctls) { if (ssortingng.Compare(ctlType, "t") == 0) { holder.Controls.Add(new TextBox()); } } } } 

Est-ce que quelqu’un pourrait m’aider / me donner des conseils sur la manière de contourner les contrôles dynamics dans le panneau de mise à jour?

Le problème est que lorsque vous créez de manière dynamic les contrôles (table, lignes, cellules, zone de texte) dans la méthode AddTxt , vous atsortingbuez une valeur d’ ID à la zone de texte. Toutefois, lorsque vous créez de manière dynamic les contrôles dans l’événement OnInit , vous ne créez pas ID valeur de l’ ID , par conséquent, le ViewState ne peut pas être câblé à ce que l’utilisateur a saisi et donc perdu.

Si vous créez la zone de texte avec la même valeur d’ ID ( txtBox.ID = "txt" + i.ToSsortingng() + j.ToSsortingng(); ) comme dans l’autre logique de création de contrôle dynamic, votre valeur ViewState sera conservée correctement. appliqué à la zone de texte lorsqu’elle est recréée dans OnInit .

Remarque: ViewState dépend fortement des valeurs d’ ID des contrôles serveur afin d’associer correctement les valeurs des contrôles entre les publications complètes et partielles.

Vous trouverez ci-dessous le code corrigé, qui fonctionne bien maintenant. J’ajoute ceci ici parce que, cela pourrait aider quelqu’un.

  protected void AddTxt(object sender, EventArgs e) { add(); } private void add() { int tblRows = 3; int tblCols = 3; Table tbl = new Table(); for (int i = 0; i < tblRows; i++) { TableRow tr = new TableRow(); for (int j = 0; j < tblCols; j++) { TableCell tc = new TableCell(); TextBox txtBox = new TextBox(); txtBox.ID = "txt" + i.ToString() + j.ToString(); //txtBox.TextChanged += new EventHandler(txt_TextChanged); tc.Controls.Add(txtBox); tr.Cells.Add(tc); } tbl.Rows.Add(tr); } holder.Controls.Add(tbl); if (Session["ctls"] != null) { Session["ctls"] += ";t"; } else { Session["ctls"] = "t"; } panel.Update(); } protected override void OnInit(EventArgs e) { base.OnInit(e); if (Session["ctls"] != null) { string[] ctls = Session["ctls"].ToString().Split(';'); foreach (string ctlType in ctls) { if (string.Compare(ctlType, "t") == 0) { add(); } } } }