要動態產生控制項並保留其狀態(值),必須依賴網站的變數
,如Session、ViewState等...
此例以ViewState方式,並模擬ASP.NET的Postback機制,控制產生的控制項
html:
<span>產生</span><asp:TextBox ID="txtCount" runat="server"></asp:TextBox>
<span>個textBox</span>
<asp:Button ID="btnAction" runat="server" Text="產生" onclick="btnAction_Click" />
<asp:Panel ID="panelZone" runat="server">
</asp:Panel>
<asp:Button ID="btnCheck" runat="server" Text="確認" onclick="btnCheck_Click" />
aspx.cs部分:
//運用asp.net的模式!,將上次postback前產生的控制項,再次還原
protected void Page_Load(object sender, EventArgs e)
{
if (ViewState["Ctl_count"] != null)
addTextBox();
}
//啟用ViewState紀錄動態產生控制項
protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
}
protected void btnAction_Click(object sender, EventArgs e)
{
int count =Convert .ToInt32 ( txtCount.Text);
ViewState["Ctl_count"] = count;
addTextBox();
}
protected void btnCheck_Click(object sender, EventArgs e)
{
string str = "";
foreach (Control ctl in panelZone.Controls)
{
string type = ctl.GetType().ToString();
if (ctl.GetType().ToString() == "System.Web.UI.WebControls.TextBox")
{
TextBox txt = (TextBox)ctl;
str +=txt.ID +":"+ txt.Text+"</br>";
}
}
Response.Write(str );
}
void addTextBox()
{
int count = Convert.ToInt32( ViewState["Ctl_count"]);
for (int i = 0; i <= count - 1; i++)
{
TextBox txt = new TextBox();
int index = (i + 1);
string id = "txt" + index;
txt.ID =id;
SetText(txt);
if (ViewState[id] == null)
txt.Text = string.Empty;
else
txt.Text = ViewState[id].ToString ();
panelZone.Controls.Add(txt);
panelZone.Controls.Add(new LiteralControl("</br>"));
}
//啟動ViewState紀錄
ViewState["controsladded"] = true;
}
//將控制項的值(或狀態),紀錄於ViewState,以供下次Postback調用
void SetText(object s)
{
TextBox txt = (TextBox)s;
string text = txt.Text;
string id = txt.ID;
ViewState[id] = text;
}
留言列表