动态生成TextBox总结

来源:互联网 发布:淘宝店铺换头像 编辑:程序博客网 时间:2024/06/07 06:51

 

  我们可以在PageLoad事件中做一个试验,80%的程序员会第一反映到:

textbox tb;
tb 
= new textbox();
this.Controns.add(控件的ID);

上面的一种方法可以实现动态生成的效果,但是不能实现多个textbox动态生成的效果。我们也许会把这段代码写在一个事件中让其多次调用,这样不就实现生成多个textbox的效果了吗。但是我们忽略了WEB程序设计实现思想,页面上的每个功能的实现都是依靠页面的页面的刷新得以实现,而每次页面加载的时候都会执行PageLoad事件。这样前一次生成的textbox就被刷新掉了,同时又执行生成生成代码动态生成一个textbox。所以无论你执行事件,或者说是执行生成代码几次,最终都只生成一个textbox。当然可以一次性生成多个,或者用一个gloabl变量暂存生成textbox的数量,每次在原有的基础上+1,这样也可以实现。但是可不可以引用就难说了。

   this.SuspendLayout();
   
int i=1,index=0;
   
for(i=1;i<=row;i++)  //default=40
   {    
     System.Windows.Forms.Label chkName;
     chkName 
= new System.Windows.Forms.Label();
     chkName.Name 
="lbl";
     chkName.Size 
= new System.Drawing.Size(8025);
     chkName.TabIndex 
=index+1;
     chkName.Text 
= "栏目名称:";
     chkName.Tag
=index;    // tag index flag;
     chkName.Left=40;
     chkName.Top 
=i*35;
     index
++;
     System.Windows.Forms.TextBox txtName;
     txtName 
= new System.Windows.Forms.TextBox();
     txtName.Name 
= "txt";
     txtName.Size 
= new System.Drawing.Size(120,25);
     txtName.TabIndex 
= index+1;
     txtName.Text
="";
     txtName.Left 
= 130;
     txtName.Top 
= i*35;
     index
++;
     
this.Controls.AddRange(new System.Windows.Forms.Control[] {chkName});
     
this.Controls.AddRange(new System.Windows.Forms.Control[] {txtName});
   }
        
   
this.ResumeLayout(false);

第二种方法:我们生成的textbox总归是要放在一个容器中,可以是div或者Panel等等。所以可以利用容器的InnerHtml属性,在其中写入Html语言

div.InnerHtml = ""
div.innerHtml 
&= "<input id = '' type = '' runat = 'server' />"  //runat = 'server'一定要加

这种方法可以生成多个textbox,要注意的是div是一个新的Div,因为如果在已有的div总动态生成textbox的话,会出现错误,是因为Div不可以在原有的基础上再添加Html控件。只有当<Div></Div>中是没有内容是可以div.innerHtml &=“...”。如果想让textbox自动对齐向下生成,可以在每次生成textbox的时候在外面自动生成一对<div></div>。我试过的。当提交表单的时候可以用Request.Form(自动生成textbox的ID)来访问动态生成textbox中的内容。

第三种方法:也可以在label的text属性中插入html

但是我们最终要的不仅仅是动态生成,更重要的是怎样利用动态生成的textbox与数据库交互。其实,以上的几种方法我都一一使用过,但是我最终都没有很好的解决与数据库交互的问题。也清理很多高手指教了一番。但是好像都没有什么进展。最终和老员工们讨论了一番,决定用GridView作为容器把它的ShowHeader属性置False,在后台动态生成数据源。与之绑定,实现效果。不论是新增到DB还是从DB中读取后Update都是可以的。而且GridView的一个好处就是利用隐藏列,这里的隐藏列不是它自带的那种,而是要编写一个CSS样式来控制他的某个列。这列可以隐式存放后台DB绑定的ID。以便保证Update的准确性。说是说不清楚的,不妨看一些代码有助于理解:

运行页面效果:

说明:实现的功能就是,点击“增加”按钮,在原有的一个TEXTBOX基础上,顺序向下添加第二个,第三个,第.........。因为页面引用CSS样式,所以TextBox呈虚线的样式。

首先在<head></head>中间加入CSS样式,以便在GridView的列中引用。

<style type = "text/css" >
    .hidden
    
{
        display
:none;
    
}

</style>

aspx代码段如下:

<div id = "divCreate" runat ="server">
                    
<asp:GridView ID="grvTestSordName" 
                                  runat
="server" 
                                  Height
="1px"
                                  AutoGenerateColumns 
="false"
                                  BorderWidth 
= "0"
                                  ShowHeader
="false" 
                                  ShowFooter
="false">
                                  
<Columns >
                                     
<asp:TemplateField >
                                        
<ItemTemplate>
                                          
<asp:TextBox ID="tbTestSordName" runat="server"  CssClass="textbox"Width="149px" />
                                        
</ItemTemplate>
                                        
<ItemStyle Height = "11px"/>
                                     
</asp:TemplateField>
                                     
<asp:BoundField  DataField ="SORID">
                                        
<ItemStyle CssClass="hidden" />
                                     
</asp:BoundField>  
                                  
</Columns>
                    
</asp:GridView>
 
</div> 

cs代码如下,主要实现自动生成后台数据源及其与前台GridView绑定的功能,也了解了,怎样访问GridView中的数据的方法。其实这个动态数据源就是一个DataTable。下面有两种状态的页面效果1、新增页面状态。2、修改页面状态

 

protected void CreateTextBox(int intCrtTbCount) //intCrtTbCount表示生成textbox的数量,即点击“增加”按钮的次数
    {
        String strTestMID 
= Request.QueryString["TestNo"];
        DataTable dTbl  
= new DataTable();
        DataColumn dCol1 
= new DataColumn();
        DataColumn dCol2 
= new DataColumn();

        dCol1.ColumnName 
= "SORDNAME";
        dCol2.ColumnName 
= "SORID";
        dTbl.Columns.Add(dCol1);
        dTbl.Columns.Add(dCol2);

        
if (strTestMID == global .EMPTY )  //表示“新增”项目页面
        {
            
for (int i = 0; i < intCrtTbCount; i++//intCrtTbCount表示生成textbox的数量,也就是在原有基础上添加的子项目数量
            {
                DataRow dRow 
= dTbl.NewRow();      //动态生成一列

                dRow[
"SORDNAME"= global.EMPTY;   //构造子项目名称列

                dRow[
"SORID"= i + 2;             //构造子项目编号列

                dTbl.Rows.Add(dRow);               
//把动态生成的一列加入到DATATABLE中
            }


            
this.grvTestSordName.DataSource = dTbl;
            
this.grvTestSordName.DataBind();

            
for (int intI = 0; intI < intCrtTbCount; intI++)
            
{
                TextBox tbTemp 
= new TextBox();
                tbTemp 
= (TextBox)this.grvTestSordName.Rows[intI].Cells[0].FindControl("tbTestSordName");
                tbTemp.Text 
= dTbl.Rows[intI]["SORDNAME"].ToString();

            }

        }


        
if (strTestMID != global .EMPTY )  //表示“修改”项目页面
        {
            DataTable tbRes 
= new DataTable();
            tbRes 
= new HYTDEPT_TEST_MAIN().GetDataTable(strTestMID);
            String strSubNumber 
= tbRes.Rows.Count.ToString();
            
int intSubNumber = int.Parse(strSubNumber);
            
int i;
            
for (i = 0; i < intSubNumber - 1; i++)                  //intSubNumber表示考核子项目数量
            {
                DataRow dRow 
= dTbl.NewRow();                       //动态生成一行

                dRow[
"SORDNAME"= tbRes.Rows[i + 1][7].ToString(); //子项目名称
                dRow["SORID"= tbRes.Rows[i + 1][6].ToString();    //子项目编号

                dTbl.Rows.Add(dRow);                                
//把动态生成的一列加入到DATATABLE中

            }


            
if (intCrtTbCount != global.ZERO)  //表示已经新增textbox,intCrtTbCount表示新增数量
            {
                String strTestSubMaxNo 
= String.Empty;
                
int intTestSubMaxNo;

                strTestSubMaxNo 
= new HYTDEPT_TEST_MAIN().GetSubMaxID(strTestMID);//获取当前DB中对应项目下子项目编号的最大值
                intTestSubMaxNo = int.Parse(strTestSubMaxNo) + 1;                 //构建新增子项目编号

                
for (int intI = global.ZERO; intI < intCrtTbCount; intI++)        //给动态数据源的行初始化
                {
                    DataRow dRow 
= dTbl.NewRow();

                    dRow[
"SORDNAME"= global.EMPTY;
                    dRow[
"SORID"= intTestSubMaxNo.ToString ();

                    dTbl.Rows.Add(dRow);              
//把动态生成的一列加入到DATATABLE中

                    intTestSubMaxNo
++;                //最为下一个子项目的编号
                }

            }


            
this.grvTestSordName.DataSource = dTbl;
            
this.grvTestSordName.DataBind();          //把动态生成的数据源和前台GridView进行帮定

            
for (int intI = 0; intI < (intSubNumber + intCrtTbCount) - 1; intI++)
            
{
                TextBox tbTemp 
= new TextBox();
                tbTemp 
= (TextBox)this.grvTestSordName.Rows[intI].Cells[0].FindControl("tbTestSordName");
                tbTemp.Text 
= dTbl.Rows[intI]["SORDNAME"].ToString();

            }

        }

       
    }

以上方法我都尝试过!上面都是我的一些感想,写出来让朋友们参考!