动态循环 textbox 取值 然后进行批量插入工作 我现在想做一个添加试卷,题目是一张表,答案是另一张表,也就是父表与子表的关系.点击一个按钮会动态显示出N个textbox 这个textbox存放的是答案, 一点添加,同时把题目和答案插入到父表与子表中去.说白了就是动态添循环textbox 并取出textbox 中的值.然后进行批量插入工作. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 foreach(Control c in this.Page.Controls) { } 你只是想到了“一点添加”,那么你这N个TextBox是如何“动态显示”的呢?好的设计是在“动态显示”时即立刻注入后续的事件处理代码的,而不是进行“动态循环取值”这个动作。 我要跟据另一个textbox里输入的数字类型值,然后去判断循环多少次,然后进行取值工作,在批量插入. 动态循环 int len = 5;//你指定的循环次数 int j = 0; string[] slist = new string[len];//用数组取值 foreach (Control c in this.Page.Controls) { if (c is TextBox&&j<len) { slist[j] = ((TextBox)c).Text; j++; } }参考批量插入SqlDataAdapter dataAdapter = new SqlDataAdapter(SQL, CONNECTION);string insertSQL = "INSERT INTO [Employee]([name], [age]) VALUES(@name, @age)";SqlCommand insertCmd = new SqlCommand(insertSQL, CONNECTION);insertCmd.Parameters.Add(new SqlParameter("@name", SqlDbType.Char, 32, "name"));//name是DataTable中对应的列名insertCmd.Parameters.Add(new SqlParameter("@age", SqlDbType.Real, 8, "age"));dataAdapter.InsertCommand = insertCmd;insertCmd.UpdatedRowSource = UpdateRowSource.None;dataAdapter.UpdateBatchSize = 0;dataAdapter.Update(DataTable); protected void Button1_Click(object sender, EventArgs e) { for (int i = 0; i < 10; i++) { TextBox TextBox1 = new TextBox(); TextBox1.ID ="text"+i.ToString(); TextBox1.Text = "sss"; this.Panel1.Controls.Add(TextBox1); }} protected void Button2_Click(object sender, EventArgs e) { for (int i = 0; i <10i++) { TextBox txtb = (TextBox)Panel1.FindControl(i.ToString()); if (txtb != null) { Label1.Text = txtb.Text.ToString(); } }}点击Button1时显示出10个动态的 textbox 点击button2时把每个textbox的值赋给label1.text 为什么 txtb 总是空值呢. 2楼的有理,LZ上面的程序把ID取错了-_-!TextBox txtb = (TextBox)Panel1.FindControl(i.ToString()); --------->TextBox txtb = (TextBox)Panel1.FindControl("text"+i.ToString()); 改了还是不行. 为什么 txtb 总是空值呢. 转不通就换个角度。哈哈 <html><head> function checkAll() { var str=''; var inputs =document.getElementById("newColumn").getElementsByTagName("input"); for(var i=0;i<inputs.length;i++) { if(inputs[i].type="text"){str=str+inputs[i].value;} } alert(str); }</head><body><div id="newColumn"></div><input type="button" onclick="checkAll();" value="checkAll" /></body></html> private void DrawTableShow() { string strHtml = ""; strHtml+="<tr><td>答案1:<intput id='text1' tpye='text' width='100px' /></td></tr>"; strHtml+="<tr><td>答案2:<intput id='text2' tpye='text' width='100px' /></td></tr>"; strHtml+="<tr><td>答案2:<intput id='text3' tpye='text' width='100px' /></td></tr>";strHtml="<table>"+strHtml+"</table>";newColumn.InnerHtml=strHtml; }你要动态显示就是从后台输出,输出的控件没有在aspx.designer.cs注册,所以要从前台处理,我之前做这是从后台输出html标签,如果要更好控制数据,建议用字段名做控件ID 动态生成的textbox ID放session或者其他 ,最后在事件上 FindControl 去获取session ID的值 .. 还是用原始的方法..<html xmlns="http://www.w3.org/1999/xhtml" ><head runat="server"> <title>无标题页</title></head><body> <form id="form1" runat="server"> <div> <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> <asp:Button ID="Button2" runat="server" Text="Button" OnClick="Button2_Click" /> <asp:Label ID="Label1" runat="server"></asp:Label> </div> </form></body></html>protected void Button1_Click(object sender, EventArgs e){ for (int i = 0; i < 10; i++) { TextBox TextBox1 = new TextBox(); TextBox1.ID = "text" + i.ToString(); TextBox1.Text = "sss" + i.ToString(); Form.Controls.Add(TextBox1); } }protected void Button2_Click(object sender, EventArgs e){ for (int i = 0; i < 10; i++) { string text = Request.Form["text" + i.ToString()]; Label1.Text += text; } } Page.Controls 既无法得到所有“答案”(例如人家是使用repeat绑定从数据库绑定的),也会把所有无关的texbox给找出来。 也会把所有无关的texbox给找出来 -> 也会把一些无关的texbox给找出来(如果这些textbox可以插入的话)。 要保持状态必须把 for (int i = 0; i < 10; i++) { TextBox TextBox1 = new TextBox(); TextBox1.ID ="text"+i.ToString(); TextBox1.Text = "sss"; this.Panel1.Controls.Add(TextBox1); } 放在page_load下,一般页面用hidden保存i的值 分为两部分 一部分是动态生成 一部分是动态取值 动态生成可以放在page_load下面,就是每次加载页面的时候都要调用一次生成控件的过程,如24楼,当你点回发按钮(提交,保存等),从page_load开始,调用动态生成的过程 ,然后调用发现动态生成的text的过程,就能找到了,找到之后你就可以自由控制了。16楼的方法基本可以的,就缺了一个回发后在pageload函数中调用page_load()// page_load 函数{ createtextbox();}//如果在本页点击按钮生成控件,那么判断一下是否回发的状态,再调用生成text的过程 protected void createtextbox(){ for (int i = 0; i < 10; i++) { TextBox TextBox1 = new TextBox(); TextBox1.ID = "text" + i.ToString(); TextBox1.Text = "sss" + i.ToString(); Form.Controls.Add(TextBox1); } } 个人认为没必要用动态生成,你可以把定义一个DataGrid或DataGridView,每个textbox是DataGrid的一个模版,这样就可以点button1来绑定DataGrid,点button2来遍历这个DataGrid,得每行的textbox控件的值.aspx: <asp:DataGrid runat="server" ID="grdMain"> <Columns> <asp:TemplateColumn> <ItemTemplate> <asp:TextBox runat="server" ID="txtAnswer"></asp:TextBox> <div style="display: none"> <asp:Label runat="server" ID="lblQuestionID" Text='<%#DataBinder.Eval(Container.DataItem,"-问题ID-") %>'></asp:Label> </div> </ItemTemplate> </asp:TemplateColumn> </Columns></asp:DataGrid>Code: button1: //连数据库得到问题的表oTable grdMain.DataSource=oTable grdMain.DataBind()button2: Dim hashAnswer As New Hashtable For Each oItem As DataGridItem In grdMain.Items //得到2个控件 Dim txtAnswer As TextBox = CType(oItem.FindControl("txtAnswer"), TextBox) Dim lblQuestionID As Label = CType(oItem.FindControl("lblQuestionID"), Label) hashAnswer.Add(lblQuestionID.Text, txtAnswer.Text) Next写的VB.net代码,不好意思,不过c#代码差不多 //写数据库 drawtatble方法就是由你自己的条件构造自己的动态table呀,然后在DIV内显示,用脚本循环DIV内的文本这样就可以准确取到相应文本的值。不知道1234觉得这方法行得通不,还是我误解了楼主的意思 .aspx<div id="inputbox"><% LoadText();%></div>.csprotected void LoadText(){DataTable table = DB.GetTable("select col_1 from table_1");int i = 0;foreach(DataRow row in table.Rows){Response.Write("<input id='text_"+ i.ToString() +"' type='text' value='"+ row[0] +"' />");i++;}}取值:.aspx<input id="hd_values" type="hidden" runat="server"/><script>function GetValue(){var puts = document.getElementById("inputbox").getElementsByTagName("INPUT");var values = "";for(var i=0; i<puts.length; i++){values += ","+puts[i].value;}document.getElementById("hd_values").value = values.substr(1);}</script>.csstring[] values = hd_values.Value.Split(','); 这个变量定义到那里好呢 这种效果应该怎么做 siteMap 的问题 关于DATAGRID数据批量下载 添加一个.dll以后命名空间重复,dll中的类不能使用~~~~ 花高价寻找一条线索,如何对文本进行编辑。 求助:怎么让网站和论坛的URL重写兼容可用?? 选了几本书,进来给个建议..... 关于 datalist 一个问题? 如何在页面提交保存后清空数据? 关于GRIDVIEW的问题 关于profile的一些摘抄
{ }
int len = 5;//你指定的循环次数
int j = 0;
string[] slist = new string[len];//用数组取值
foreach (Control c in this.Page.Controls)
{
if (c is TextBox&&j<len)
{
slist[j] = ((TextBox)c).Text;
j++;
} }
参考批量插入SqlDataAdapter dataAdapter = new SqlDataAdapter(SQL, CONNECTION);
string insertSQL = "INSERT INTO [Employee]([name], [age]) VALUES(@name, @age)";SqlCommand insertCmd = new SqlCommand(insertSQL, CONNECTION);
insertCmd.Parameters.Add(new SqlParameter("@name", SqlDbType.Char, 32, "name"));//name是DataTable中对应的列名
insertCmd.Parameters.Add(new SqlParameter("@age", SqlDbType.Real, 8, "age"));dataAdapter.InsertCommand = insertCmd;
insertCmd.UpdatedRowSource = UpdateRowSource.None;dataAdapter.UpdateBatchSize = 0;
dataAdapter.Update(DataTable);
{
for (int i = 0; i < 10; i++)
{
TextBox TextBox1 = new TextBox();
TextBox1.ID ="text"+i.ToString();
TextBox1.Text = "sss";
this.Panel1.Controls.Add(TextBox1);
}
} protected void Button2_Click(object sender, EventArgs e)
{
for (int i = 0; i <10i++)
{
TextBox txtb = (TextBox)Panel1.FindControl(i.ToString()); if (txtb != null)
{
Label1.Text = txtb.Text.ToString(); }
}
}
点击Button1时显示出10个动态的 textbox 点击button2时把每个textbox的值赋给label1.text 为什么 txtb 总是空值呢.
LZ上面的程序把ID取错了-_-!
TextBox txtb = (TextBox)Panel1.FindControl(i.ToString());
--------->
TextBox txtb = (TextBox)Panel1.FindControl("text"+i.ToString());
<html>
<head>
function checkAll()
{
var str='';
var inputs =document.getElementById("newColumn").getElementsByTagName("input");
for(var i=0;i<inputs.length;i++)
{
if(inputs[i].type="text")
{
str=str+inputs[i].value;
}
}
alert(str);
}
</head>
<body>
<div id="newColumn"></div>
<input type="button" onclick="checkAll();" value="checkAll" />
</body>
</html>
private void DrawTableShow()
{
string strHtml = "";
strHtml+="<tr><td>答案1:<intput id='text1' tpye='text' width='100px' /></td></tr>";
strHtml+="<tr><td>答案2:<intput id='text2' tpye='text' width='100px' /></td></tr>";
strHtml+="<tr><td>答案2:<intput id='text3' tpye='text' width='100px' /></td></tr>";
strHtml="<table>"+strHtml+"</table>";
newColumn.InnerHtml=strHtml;
}
你要动态显示就是从后台输出,输出的控件没有在aspx.designer.cs注册,所以要从前台处理,
我之前做这是从后台输出html标签,如果要更好控制数据,建议用字段名做控件ID
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
<asp:Button ID="Button2" runat="server" Text="Button" OnClick="Button2_Click" />
<asp:Label ID="Label1" runat="server"></asp:Label>
</div>
</form>
</body>
</html>protected void Button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
TextBox TextBox1 = new TextBox();
TextBox1.ID = "text" + i.ToString();
TextBox1.Text = "sss" + i.ToString();
Form.Controls.Add(TextBox1);
}
}protected void Button2_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
string text = Request.Form["text" + i.ToString()];
Label1.Text += text;
}
}
Page.Controls 既无法得到所有“答案”(例如人家是使用repeat绑定从数据库绑定的),也会把所有无关的texbox给找出来。
for (int i = 0; i < 10; i++)
{
TextBox TextBox1 = new TextBox();
TextBox1.ID ="text"+i.ToString();
TextBox1.Text = "sss";
this.Panel1.Controls.Add(TextBox1);
}
放在page_load下,一般页面用hidden保存i的值
动态生成可以放在page_load下面,就是每次加载页面的时候都要调用一次生成控件的过程,如24楼,当你点回发按钮(提交,保存等),从page_load开始,调用动态生成的过程 ,然后调用发现动态生成的text的过程,就能找到了,找到之后你就可以自由控制了。
16楼的方法基本可以的,就缺了一个回发后在pageload函数中调用
page_load()// page_load 函数
{
createtextbox();
}//如果在本页点击按钮生成控件,那么判断一下是否回发的状态,再调用生成text的过程
protected void createtextbox()
{
for (int i = 0; i < 10; i++)
{
TextBox TextBox1 = new TextBox();
TextBox1.ID = "text" + i.ToString();
TextBox1.Text = "sss" + i.ToString();
Form.Controls.Add(TextBox1);
}
}
aspx:
<asp:DataGrid runat="server" ID="grdMain">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:TextBox runat="server" ID="txtAnswer"></asp:TextBox>
<div style="display: none">
<asp:Label runat="server" ID="lblQuestionID" Text='<%#DataBinder.Eval(Container.DataItem,"-问题ID-") %>'></asp:Label>
</div>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>Code:
button1:
//连数据库得到问题的表oTable
grdMain.DataSource=oTable
grdMain.DataBind()
button2:
Dim hashAnswer As New Hashtable
For Each oItem As DataGridItem In grdMain.Items
//得到2个控件
Dim txtAnswer As TextBox = CType(oItem.FindControl("txtAnswer"), TextBox)
Dim lblQuestionID As Label = CType(oItem.FindControl("lblQuestionID"), Label)
hashAnswer.Add(lblQuestionID.Text, txtAnswer.Text)
Next
写的VB.net代码,不好意思,不过c#代码差不多
//写数据库
<div id="inputbox"><% LoadText();%></div>.cs
protected void LoadText()
{
DataTable table = DB.GetTable("select col_1 from table_1");
int i = 0;
foreach(DataRow row in table.Rows)
{
Response.Write("<input id='text_"+ i.ToString() +"' type='text' value='"+ row[0] +"' />");
i++;
}
}取值:
.aspx
<input id="hd_values" type="hidden" runat="server"/>
<script>
function GetValue()
{
var puts = document.getElementById("inputbox").getElementsByTagName("INPUT");
var values = "";
for(var i=0; i<puts.length; i++){
values += ","+puts[i].value;
}
document.getElementById("hd_values").value = values.substr(1);
}
</script>.cs
string[] values = hd_values.Value.Split(',');