對於很多時候,我們在開發的時候,需要動態添加控制項,包括Html控制項,Asp.Net 控制項。
js產生html控制項
function AddProperty()
{
var count = document.getElementById('hidCount').value;
var str = "<BR> 屬性名稱:<input type=\"Text\" id=\"txtProperty"+count+"\" name=\"txtProperty"+count+"\" /> 屬性描述:<input type=\"Text\" id=\"txtDesc"+count+"\" name=\"txtDesc"+count+"\" />";
count++;
document.getElementById('hidCount').value=count;
document.getElementById('catePro').innerHTML+=str;
}
因為要為產生的控制項要能取其值,所以,必須必須指定其ID,可以先在頁面放一個HiddenField控制項,並指定預設值為0;當動態添加控制項時,可以通過JS指令碼改變其值,指令碼如上。
<asp:HiddenField ID="hidCount" Value="0" runat="server" />
在頁面 後台,可以通過以下方式取其值,如下:
int count = int.Parse(this.hidCount.Value);//取得產生控制項的個數,儲存在頁面的HiddenField中,並可以得知其ID
for (int i = 0; i < count; i++)
{
string propName = string.Empty;
string propDesc = string.Empty;
if (!string.IsNullOrEmpty(Request["txtProperty" + i]))//判斷是否存在
{
PIM.Model.CateProperty model = new PIM.Model.CateProperty();
propName = Request["txtProperty" + i].ToString();//,取得產生的控制項的值
propDesc = Request["txtDesc" + i].ToString();
//......
}
}
二、動態產生Asp.Net伺服器控制項,並取其值
private void LoadProperty(int cateId)
{
HtmlGenericControl span = new HtmlGenericControl();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
StringBuilder strHtml = new StringBuilder();
if (i % 2 == 0)
{
strHtml.Append("<div >");
strHtml.Append("<div class=\"layout1\">");
}
else
{
strHtml.Append("<div >");
}
TextBox txt = new TextBox();
Label lbl = new Label();
HiddenField hdf = new HiddenField();//
lbl.ID = "lblProp" + i.ToString();
lbl.Text = ds.Tables[0].Rows[i]["PropName"].ToString() + ":";
txt.ID = "txtProp" + i.ToString();
hdf.ID = "hdfProp" + i.ToString();//
lbl.EnableViewState = true;
txt.EnableViewState = true;
hdf.EnableViewState = true;//
LiteralControl lc = new LiteralControl(strHtml.ToString());
lc.EnableViewState = true;
span.Controls.Add(lc);
span.Controls.Add(lbl);
span.Controls.Add(txt);
span.Controls.Add(hdf);//
if (i % 2 == 0)
{
span.Controls.Add(new LiteralControl("</div></div>"));
}
else
{
span.Controls.Add(new LiteralControl("</div>"));
}
}
}
動態產生的控制項,當點擊頁面按鈕時會重新整理頁面,所以,產生控制項的方法不需要
if(!IsPostBack)
{
}
如果在PageLoad方法中,即使每回都動態載入都無法得到其資料,且動態產生的控制項會消失,所以,根據Asp.Net生命週期,我們將產生控制項在OnInit()方法中,
即重寫此方法
protected override void OnInit(EventArgs e)
{
LoadProperty(cateID);//在OnInit中執行動態添加控制項的方法,這樣就會儲存其狀態視圖
}
如果這些動態產生的控制項,在產生的時候,就需要從資料庫中取值,並為其賦值,可以在PageLoad中進行賦值操作,
這時就可以使用(!IsPostBack),且不會丟失其值。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (!string.IsNullOrEmpty(Request["productId"]))
{
string productId = Request["productId"].ToString();
int parentId = int.Parse(ParentID);
LoadData(productId, parentId);//可以用方法對其賦值。。。具體實現省略。
}
}
}