动态生成页面(二)

在上篇文章《动态生成页面(一)——ASP.NET中Literal使用》中,,介绍了通过Literal容器动态加载页面。但在取值过程中遇到了一些问题。但是因为拼接的控件textbox为服务器控件,所以在取值过程中遇到一些问题。

几经周转,最后无奈改变了实现方法。直接实例化出控件,然后添加到页面中。具体实现过程如下:

前台页面:

<body><form id="form1" runat="server"><div id="test"></div></form></body>

后台拼接:

#region SingleControl-单个组合控件-2015年7月27日-杨晓敏/// <summary>/// 单个组合控件/// </summary>/// <param name="model"></param>/// <param name="i"></param>public void SingleControl(IList<ModelBFieldDef> model, int i){string Type = model[i].SFieldUitype;Label lblName = new Label();lblName.Width = 200;lblName.Style.Add("TEXT-ALIGN", "right");lblName.Text = model[i].SFieldNamecn;bool statusFlag;if (status == "edit"){statusFlag = true;}else{statusFlag = false;}int strRowId = Convert.ToInt32(strFieldPara);string strFieldId = model[i].SFieldId;IList<ModelBDataDef> ValueModel;BDataDefModel.NRowId = strRowId;BDataDefModel.SFieldId = strFieldId;ValueModel = _BLLBDataDef.GetList(BDataDefModel);string strValue = ValueModel[0].SValue;switch (Type){case "String": //文本框类型TextBox txtContent = new TextBox();txtContent.ID = model[i].SFieldId;txtContent.MaxLength = Convert.ToInt32(model[i].SFieldLen);tableContainer.Controls.Add(new LiteralControl("<br>"));tableContainer.Controls.Add(lblName);tableContainer.Controls.Add(new LiteralControl(" "));tableContainer.Controls.Add(txtContent);tableContainer.Controls.Add(new LiteralControl("<br>"));if (statusFlag){//string strID = "ctl00$ContentPlaceHolder1$" + model[i].SFieldId;//TextBox strTxt = (TextBox)this.FindControl(strID) as TextBox;// test为获取控件的IDtxtContent.Text = strValue;}break;case "CheckBox": //复选框类型CheckBox cbxContent = new CheckBox();cbxContent.ID = model[i].SFieldId;tableContainer.Controls.Add(new LiteralControl("<br>"));tableContainer.Controls.Add(lblName);tableContainer.Controls.Add(new LiteralControl(" "));tableContainer.Controls.Add(cbxContent);tableContainer.Controls.Add(new LiteralControl("<br>"));if (statusFlag){string strID = "ctl00$ContentPlaceHolder1$" + model[i].SFieldId;CheckBox strTxt = (CheckBox)this.FindControl(strID) as CheckBox;// test为获取控件的IDif (strValue == "on"){strTxt.Checked = true;}else{strTxt.Checked = false;}}break;case "Select": //下拉框类型DropDownList ddl = new DropDownList();ddl.ID = model[i].SFieldId;if (model[i].SDictType == "1"){string str = model[i].SDictId;//以;; , ,分割字符char[] strSplit = { ';', ';', ',', ',' };string[] datas = str.Split(strSplit);ddl.Items.Add("");for (int n = 0; n < datas.Length; n++){ddl.Items.Add(datas[n]);}}tableContainer.Controls.Add(new LiteralControl("<br>"));tableContainer.Controls.Add(lblName);tableContainer.Controls.Add(new LiteralControl(" "));tableContainer.Controls.Add(ddl);tableContainer.Controls.Add(new LiteralControl("<br>"));ddl.SelectedValue = strValue;if (statusFlag){//string strID = "ctl00$ContentPlaceHolder1$" + model[i].SFieldId;//TextBox strTxt = (TextBox)this.FindControl(strID) as TextBox;// test为获取控件的ID//strTxt.Text = strValue;ddl.SelectedValue = strValue;}break;default:break;}}#endregion

获取拼接控件的值

获取控件的值,可以通过FindControl来取值或赋值。如,要取TextBox1的值,则可以:

protected void Button1_Click(object sender, EventArgs e){//Control c = this.FindControl("TextBox1");//TextBox tb= (TextBox)c;//FindControl返回的是一个Control类型的控件,需要强制类型转化成TextBox类型TextBox tb=(TextBox)this.FindControl("TextBox1") as TextBox;this.Label1.Text = tb.Text;}

需要注意的是,如果TextBox被放在其他容器里,其ID值可能发生改变,如放在Datagrid中,从HTML页面中查看其ID为:

<input name="dg1$ctl02$TextBox1" type="text" id="dg1_ctl02_TextBox1" />

在获取TextBox控件时,我们就需要改变FindControl中Id的值。在实现过程中因为忽略了这一点,一直取不到值,在调试上浪费了很多时间。



版权声明:本文为博主原创文章,未经博主允许不得转载。

只要功夫深,铁棒磨成绣花针。

动态生成页面(二)

相关文章:

你感兴趣的文章:

标签云: