ASP.NETページのViewState
は動的に削除されたコントロールとその値に追いつくのに苦労しているようです。ViewStateと動的に削除されたコントロール
のは、一例として、次のコードを見てみましょう:
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());
}
その後、あなたは4つのコントロールを作成し、挿入しましょう以下の値:
[ 1 ] [ 2 ] [ 3 ] [ 4 ]
2番目のコントロールを削除します。第2の制御を取り除いた後に、
[ 1 ] [ 3 ] [ 4 ]
が出力されます。残念ながら、その後のポストバックで、リスト は次のようになります。
[ 1 ] [ ] [ 3 ]
だから、私の質問は、なぜこの出来事はありますか?私が読んだ限り、ViewState
は、実際のコントロールではなく、インデックスに関連してコントロールのプロパティを保存する必要があります。
を私は、関連する問題を持っている - 私は、コンボポストバックに依存するGridViewを持っています。コンボを変更すると、新しいコンボ値のデータでグリッドがリフレッシュされます。しかしリフレッシュするとグリッドはコンボの最初のアイテムのデフォルトデータに戻りますが、コンボはリフレッシュ時に選択されたアイテムにリセットされます。グリッドとコンボは同期していません。私はバインドし、コンボを 'Page_Load if!postback'の最初の項目に設定しようとしましたが、htmlは' selected = "selected" 'に装飾されていることをhtmlが示していますが、項目!これは関連していますか? – Chris