我现在想做一个添加试卷,题目是一张表,答案是另一张表,也就是父表与子表的关系.点击一个按钮会动态显示出N个textbox 这个textbox存放的是答案, 一点添加,同时把题目和答案插入到父表与子表中去.说白了就是动态添循环textbox 并取出textbox 中的值.然后进行批量插入工作.

解决方案 »

  1.   

    foreach(Control c in this.Page.Controls)
            {        }
      

  2.   

    你只是想到了“一点添加”,那么你这N个TextBox是如何“动态显示”的呢?好的设计是在“动态显示”时即立刻注入后续的事件处理代码的,而不是进行“动态循环取值”这个动作。
      

  3.   

    我要跟据另一个textbox里输入的数字类型值,然后去判断循环多少次,然后进行取值工作,在批量插入.
      

  4.   

    动态循环
                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);
      

  5.   

      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 总是空值呢.
      

  6.   

    2楼的有理,
    LZ上面的程序把ID取错了-_-!
    TextBox txtb = (TextBox)Panel1.FindControl(i.ToString()); 
    --------->
    TextBox txtb = (TextBox)Panel1.FindControl("text"+i.ToString()); 
      

  7.   

    改了还是不行. 为什么 txtb 总是空值呢.
      

  8.   

    转不通就换个角度。哈哈 
    <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
      

  9.   

    动态生成的textbox ID放session或者其他 ,最后在事件上 FindControl 去获取session ID的值 ..
      

  10.   

    还是用原始的方法..
    <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;
        } 
    }
      

  11.   


    Page.Controls 既无法得到所有“答案”(例如人家是使用repeat绑定从数据库绑定的),也会把所有无关的texbox给找出来。
      

  12.   

    也会把所有无关的texbox给找出来  ->  也会把一些无关的texbox给找出来(如果这些textbox可以插入的话)。
      

  13.   

    要保持状态必须把
       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的值
      

  14.   

    分为两部分  一部分是动态生成 一部分是动态取值 
    动态生成可以放在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);
        } 
    }
      

  15.   

    个人认为没必要用动态生成,你可以把定义一个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#代码差不多
           //写数据库
      

  16.   

    drawtatble方法就是由你自己的条件构造自己的动态table呀,然后在DIV内显示,用脚本循环DIV内的文本这样就可以准确取到相应文本的值。不知道1234觉得这方法行得通不,还是我误解了楼主的意思
      

  17.   

    .aspx
    <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(',');