动态生成页面(二)

来源:互联网 发布:c语言大小写转换程序 编辑:程序博客网 时间:2024/06/08 08:50

      在上篇文章《动态生成页面(一)——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为获取控件的ID                    txtContent.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为获取控件的ID                    if (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的值。在实现过程中因为忽略了这一点,一直取不到值,在调试上浪费了很多时间。








1 0
原创粉丝点击