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