La page ViewState
d'une page ASP.NET semble avoir des problèmes de suivi avec les contrôles supprimés dynamiquement et leurs valeurs.ViewState et les contrôles supprimés de manière dynamique
Prenons le code suivant comme exemple:
ASPX:
<form id="form1" runat="server">
<div>
<asp:Panel runat="server" ID="controls" />
</div>
</form>
CS:
protected void Page_Init(object sender, EventArgs e) {
Button b = new Button();
b.Text = "Add";
b.Click +=new EventHandler(buttonOnClick);
form1.Controls.Add(b);
Button postback = new Button();
postback.Text = "Postback";
form1.Controls.Add(postback);
}
protected void Page_Load(object sender, EventArgs e) {
if (ViewState["controls"] != null) {
for (int i = 0; i < int.Parse(ViewState["controls"].ToString()); i++) {
controls.Controls.Add(new TextBox());
Button remove = new Button();
remove.Text = "Remove";
remove.Click +=new EventHandler(removeOnClick);
controls.Controls.Add(remove);
controls.Controls.Add(new LiteralControl("<br />"));
}
}
}
protected void removeOnClick(object sender, EventArgs e) {
Control s = sender as Control;
//A hacky way to remove the components around the button and the button itself
s.Parent.Controls.Remove(s.Parent.Controls[s.Parent.Controls.IndexOf(s) + 1]);
s.Parent.Controls.Remove(s.Parent.Controls[s.Parent.Controls.IndexOf(s) - 1]);
s.Parent.Controls.Remove(s.Parent.Controls[s.Parent.Controls.IndexOf(s)]);
ViewState["controls"] = (int.Parse(ViewState["controls"].ToString()) - 1).ToString();
}
protected void buttonOnClick(object sender, EventArgs e) {
if (ViewState["controls"] == null)
ViewState["controls"] = "1";
else
ViewState["controls"] = (int.Parse(ViewState["controls"].ToString()) + 1).ToString();
controls.Controls.Add(new TextBox());
}
Ensuite, nous allons vous dire créer 4 commandes et insérez le valeurs suivantes:
[ 1 ] [ 2 ] [ 3 ] [ 4 ]
Nous voulons supprimer le second contrôle; après avoir enlevé la deuxième commande la sortie est:
[ 1 ] [ 3 ] [ 4 ]
qui est ce que nous voulons. Malheureusement, une publication ultérieure, la liste devient :
[ 1 ] [ ] [ 3 ]
Alors, ma question est, pourquoi est-ce qui se passe? Pour autant que j'ai lu, ViewState
devrait enregistrer les propriétés des contrôles par rapport à leurs index, pas les contrôles réels.
J'ai un problème connexe - J'ai une personne à charge gridview sur un postback combo. Lorsque vous modifiez le combo, la grille est actualisée avec les données de la nouvelle valeur de combo. Mais si vous cliquez sur Rafraîchir, la grille retourne aux données par défaut du premier élément de la liste déroulante, mais la liste déroulante est réinitialisée à l'élément sélectionné lors de l'actualisation. La grille et la combinaison ne sont donc pas synchronisées. J'ai essayé de lier et de placer le combo sur le premier élément de 'Page_Load if! Postback', et le html montre que le premier élément est décoré' selected = "selected" ', mais un peu de javascript le change en non-défaut article! Est-ce lié? – Chris