动态生成页面(二)

      在上篇文章动态生成页面(一)——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
    收藏
    觉得还不错? 一键收藏
  • 38
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值