日期:2014-05-17  浏览次数:21008 次

asp.net动态添加控件并获取值

做教师考评系统前台界面,要求加上批量处理,需要在前台显示被测评人的人名,最开始使用的是treeview控件,但是因为每组分类的人数不均,多的话可能一百条,所以用treeview就显得有些力不从心了,最终决定做一个既能像treeview一样是树形结构,又能没列显示多条数据使空间变小的控件组。

Treeview控件的灵活性就在于它是后台绑定的,数据可以根据数据库的变更而更新,所以,我们要想实现这一效果,必须得用到动态绑定控件。

前台代码:

    <asp:Button ID="createbutton" runat="server" Text="显示按钮" 
            onclick="createbutton_Click" />
    <asp:Table ID="HolderTable" CssClass ="tab"  runat="server" 
         BorderColor="#000066" BorderStyle="Solid"></asp:Table>
     <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />


 

在后台执行数据绑定:

 void CreateControl()
    {
              MgrDivisionManager division = new MgrDivisionManager();
        DataTable dat = division.QueryAllDivision();
        MgrCriticsMain staff = new MgrCriticsMain();
        if (ViewState["CreateControl"] == null) return;        for (int x = 0; x < dat.Rows.Count; x++)
        {
            TableRow row = new TableRow();
           
                TableCell cell = new TableCell();
                EnStaff enStaff = new EnStaff();
                enStaff.EmployeeID = "6";
                enStaff.GradeGroupID = Convert.ToInt32(dat.Rows[x][0].ToString());
                DataTable dtStaff = new DataTable();
                dtStaff = staff.QueryEligibleByCritics(enStaff);
                if (dtStaff.Rows.Count > 0)
                {
                     Button bt = new Button();
                    bt.Text = dat.Rows[x][1].ToString();
                
                    bt.ID = dat.Rows[x][0].ToString();
                    bt.Width = 200;
                
                    CheckBoxList cblist = new CheckBoxList();
                    cblist.DataSource = dtStaff;
                    cblist.ID = "cblist" + dat.Rows[x][0].ToString(); ;
                    cblist.DataTextField = "参评者";
                    cblist.DataValueField = "编号";
                    cblist.RepeatColumns = 10;
                    cblist.DataBind();
                    cell.Controls.Add(bt);
                    cell.Controls.Add(cblist);
                    row.Cells.Add(cell); 
                    HolderTable.Rows.Add(row);
                }
       
        }
    }


 

当然,这样显示是没有问题了,显示出来的目的就是为了使用,所以,我们还需要从后台获取绑定的控件的值

   protected void Button1_Click(object sender, EventArgs e)
    {
              CheckBoxList cbk = HolderTable.FindControl("cblist1") as CheckBoxList;
           string selval = "";
             for(int i=0;i<cbk.Items.Count;i++)
             {
               if(cbk.Items[i].Selected )
                {
                     if (cbk.Items[i].Text.IndexOf("其它") != -1)
                     {
                         selval += "|";
                     }
                     else
                     {
                        selval += cbk.Items[i].Text + "|";
                     }
                 }
             }
            Response.Write( selval);
    }


 

最终显示效果为:

最开始在做treeview之前,我们就认为这是一个不可能实现的工作,最终我们实现了,在需要修改的时候我同样认为这是一个很需要时间的工作,最终也就半天就完成了,其实通过这次改动也就发现,只要有需求,就有思考,就能做出来。

&