我需要做一个项目,要动态在一个表格中添加一些复选按钮和文本(文本是从数据库查到的),客户端选择了复选框然后点击提交按钮后,服务器端怎么才能访问到那些动态添加的复选框的状态。
我把一个类似的示例代码贴在下面,请大家能帮我看看吧,先谢谢了。aspx文件如下:
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <table style="width: 243px; height: 134px" id="TABLE1" runat="server" border="1">
            <tr>
                <td style="height: 99px" >
                </td>
                <td style="height: 99px">
                </td>
              
            </tr>
           
        </table>
        <br />
        <asp:Button ID="Button1" runat="server" Text="提交" OnClick="Button1_Click" /></div>
    </form>
</body>
</html>
后台cs文件如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            CheckBox chk1 = new CheckBox();
            chk1.ID = "ck1";
            this.TABLE1.Rows[0].Cells[0].Controls.Add(chk1);
            LiteralControl lc1 = new LiteralControl("篮球");
            this.TABLE1.Rows[0].Cells[0].Controls.Add(lc1);
            CheckBox chk2 = new CheckBox();
            chk2.ID = "ck2";
            this.TABLE1.Rows[0].Cells[1].Controls.Add(chk2);
            LiteralControl lc2 = new LiteralControl("排球");
            this.TABLE1.Rows[0].Cells[1].Controls.Add(lc2);        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
       // CheckBox chk = (CheckBox)this.TABLE1.Rows[0].Cells[0].FindControl("ck1"); 这里chk为空,不能取得
        CheckBox chk = this.TABLE1.Rows[0].Cells[0].Controls[0] as CheckBox;//chk也为空!
       //if (chk.Checked)由于chk为空, 所以不能访问      
        { 
            //...
        }      
    }
}

我在点击提交后表格中什么也没有了,我想可能是因为复选框和文本是动态添加的,而且写在if(!IsPostBack){}里面所以在提交后就没有了,但程序的ViewState可以保存回发数据呀,而且默认情况EnableViewState=true,就是说可以保存CheckBox和文本,我一直不明白为何控件提交了就没了。这种情况我该怎么写才能获取复选框?请指教。

解决方案 »

  1.   

    去掉if (!IsPostBack) 点击按钮后,会进行postback,进page_load再进Button1_Click
    你在page_load判断是postback就不添加控件了,因此取不到控件。
      

  2.   

    去掉if (!IsPostBack) 好像不行,因为复选框控件再次加载会造成该控件的选择状态不被保存。
      

  3.   

    你先理解下  Asp.net页面的生命周期  运行的流程
      

  4.   

    建议你用JS动态添加吧,ASP.NET的框架是以事件驱动,对于这个设计来说特别麻烦,会有更高的效率,灵活些
      

  5.   

    <div>
            <asp:Table runat="server" ID="Tb_Test" BorderWidth="1" Width="243px" Height="134px">
            </asp:Table>
            <br />
            <asp:Button ID="Button1" runat="server" Text="提交" OnClick="Button1_Click" />
        </div>cs:
    protected void Page_Load(object sender, EventArgs e)
        {
            TableRow rowchk = new TableRow();
            TableCell cell1 = new TableCell();
            TableCell cell2 = new TableCell();
            CheckBox chk1 = new CheckBox();
            chk1.ID = "ck1";
            cell1.Controls.Add(chk1);
            LiteralControl lc1 = new LiteralControl("篮球");
            cell1.Controls.Add(lc1);
            CheckBox chk2 = new CheckBox();
            chk2.ID = "ck2";
            cell2.Controls.Add(chk2);
            LiteralControl lc2 = new LiteralControl("排球");
            cell2.Controls.Add(lc2);
            rowchk.Controls.Add(cell1);
            rowchk.Controls.Add(cell2);
            this.Tb_Test.Controls.Add(rowchk);
    }
    也可
    js:直接插入<input id="Checkbox1" type="checkbox" value="篮球" />
      

  6.   

    篮球、排球?你可以在IDE上拖入一个DataList控件,然后编辑模板并拖入CheckBox控件,并且设置好数据源。如果不了解如何使用asp.net2.0开发数据驱动程序,可以参看Scott Mitchell的教程中的这一篇。这一篇中他使用ObjectDataSource来读取数据库,你可以改为任意一种产生数据记录的方法(例如手动追加记录)。总之,你手写的代码太多了。手写代码很多,不能证明开发技术的高低,设计产品非常棒的人往往只写不足1/5的代码就完成了程序创意。
      

  7.   

    可以把要保存到asp:HiddenField或者html的hidden(注意加上runat='server')
      

  8.   

    DataList中拖入的静态CheckBox在选中提交后能够被获取状态吗?我先试试。