//代码如下,我知道错误的原因,就是没有办法解决
protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {   int i=0;
            CheckBoxList cbl = new CheckBoxList();
            cbl.ID = "cbl1";
            cbl.RepeatDirection = RepeatDirection.Horizontal;
            cbl.Items .Add (new ListItem (i.ToString ()));
            cbl.Items.Add(new ListItem(i.ToString()));
            cbl.Items.Add(new ListItem(i.ToString()));
            form1.Controls.Add(cbl);
            i++;
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        CheckBoxList cbl = new CheckBoxList();
        cbl = (CheckBoxList)form1.FindControl("cbl1");/*无法用此引用到该控件*/
        ViewState["cblInfo"] = cbl.SelectedItem.Text;/*这里就出错误了,因为使用了null引用(空引用)infamous Error!!!*/
        Response .Write (ViewState ["cblInfo"].ToString ()); 
    } 

解决方案 »

  1.   

    分析补充:
    如果使用foreach找不到那个动态生成控件,(只找到一个事先我放的button1)我想是
    .net把动态生成的控件转换成html标签了。当我们测试进入页面,这时根本已经不是我们“想像的”服务器端控件了那些checkBoxList,都是静态标记了。所以无法使用,那么要怎么解决这个问题呢?还有就是如果我动态生成大量的CheckBoxList,就会出现下面的情况:
    .net会自动给动态生成控件命名的,真是麻烦,即使你设了,
    比如你动态生成几十个checkBoxList,都给它设了id,当生成
    html页面后,你看html源码会发现,生成的id跟你命名的不一致。
      

  2.   

    做asp.net没多久,虽然asp.net引入了很多winform的机制,但到底还是
    有很多不同的。所以这个问题就比较不好解决了。
      

  3.   

    动态创建的不能保存状态,使用
    Request.Form["cbl1"]得到
      

  4.   

    可以先在html界面中定义空的CheckBoxList,然后在page_load事件中动态添加item,这样就可以在Button1_Click事件中取到这个CheckBoxList
      

  5.   

    楼上的两位,谢谢了。不过
    //可以先在html界面中定义空的CheckBoxList空的//只能在设计时用,
    我现在要从数据库加载的,所以,呵呵。只能用Request了。
    动态创建不能保存状态,没办法,这是.net机制决定了。
      

  6.   

    声明上面试试    public CheckBoxList cbl;