动态生成TextBox总结
来源:互联网 发布:淘宝店铺换头像 编辑:程序博客网 时间:2024/06/07 06:51
我们可以在PageLoad事件中做一个试验,80%的程序员会第一反映到:
tb = new textbox();
this.Controns.add(控件的ID);
上面的一种方法可以实现动态生成的效果,但是不能实现多个textbox动态生成的效果。我们也许会把这段代码写在一个事件中让其多次调用,这样不就实现生成多个textbox的效果了吗。但是我们忽略了WEB程序设计实现思想,页面上的每个功能的实现都是依靠页面的页面的刷新得以实现,而每次页面加载的时候都会执行PageLoad事件。这样前一次生成的textbox就被刷新掉了,同时又执行生成生成代码动态生成一个textbox。所以无论你执行事件,或者说是执行生成代码几次,最终都只生成一个textbox。当然可以一次性生成多个,或者用一个gloabl变量暂存生成textbox的数量,每次在原有的基础上+1,这样也可以实现。但是可不可以引用就难说了。
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(80, 25);
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 &= "<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的列中引用。
.hidden
{...}{
display:none;
}
</style>
aspx代码段如下:
<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、修改页面状态
...{
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();
}
}
}
以上方法我都尝试过!上面都是我的一些感想,写出来让朋友们参考!
- 动态生成TextBox总结
- C# 后台动态生成textbox
- C# 动态生成textbox,Combobox等控件
- ASP.NET动态生成TextBox并获取其值
- C# 动态生成的textbox怎样获取值
- ASP.NET动态生成TextBox并获取其值
- ajax智能提示+textbox动态生成下拉框
- 动态创建TextBox
- 动态添加、删除Textbox
- easyui中easyui-textbox在前台加载json动态生成下拉框
- 生成textBox功能的实现
- js动态树的生成方式总结
- 使用dhtmltree动态生成树菜单总结
- 后台动态创建TextBox控件
- 获取动态textbox的Text
- 如何动态添加textbox (Jquery)
- 动态新增服务器控件TextBox
- easyui textbox动态添加属性
- 惊叹微软Surface触控系统
- 利用TDC组件实现对WEB页面的交互操作
- 附加EventHandler类库的问题
- 学习ASP.NET步骤 适合于连JS与CSS、SQL都搞不清的新手。
- 创建和打印大宗邮件的标签--Word篇
- 动态生成TextBox总结
- LinkedHashMap & LinkedHashSet
- JAVA读取WORD,EXCEL,POWERPOINT,PDF文件的方法
- vi基本命令
- SharePoint Portal Server 2003 容量规划
- 一个UBB类及其使用方法(C#完整版)
- 基于PocketPC的CF卡驱动程序设计
- ASP.NET技术的学习顺序问题
- ajax学习第二天