后台代码:CheckBoxList cc = new CheckBoxList();
cc.ID = "cc";
cc.RepeatColumns = 5;
Panel1.Controls.Add(cc);
for (int m = 0; m < 3; m++)
   {
       cc.Items.Add(new ListItem(m.ToString(), m.ToString()));
   }前台正常产生的这个checkboxlist控件的代码变成了
<input id="cc_0" type="checkbox" name="cc$0" />就是ID和定义的不同了,生成的代码如下:
<table id="cc" border="0">
   <tr>
      <td>
           <input id="cc_0" type="checkbox" name="cc$0" /><label for="cc_0">0</label>
      </td>
      <td>
           <input id="cc_1" type="checkbox" name="cc$1" /><label for="cc_1">1</label>
      </td>
      <td>
           <input id="cc_2" type="checkbox" name="cc$2" /><label for="cc_2">2</label>
      </td>
   </tr>
</table>
进行是否选择了验证的时候,打算再用循环来判断是否选中,代码如下:CheckBoxList eee = (CheckBoxList)form1.FindControl("cc");
for (int i = 0; i < eee.Items.Count; i++)
                        {                            if (eee.Items[i].Selected)
                            {
                                a = true;
                                break;
                            }
                        }
                        if (!a)
                        {
                            Label.Text = "题目为必填";
                        }出错,提示:未将对象引用设置到对象的实例。 
发现eee都是null的,怎么办?找到MSDN文档,发现它给的是很正常的ID="checklistbox1" ,可是在后台生成的这控件ID都变了,要怎么解决啊?

解决方案 »

  1.   

    补充一下,而且因为是投票系统,多选框组有几个也是动态决定的,每个组有几个选项,选项的值也是动态的,所以在aspx页面上不好控制,因为ID都是动态生成的,另外,Request.Form["cc"]的方法无论多选框组是否有选择,都是出错...未将对象引用设置到对象的实例。
      

  2.   

    FindControl里面的 是 id  不是 clientid 你说的是 clientid 变化了
      

  3.   

    你明明吧cc add 到了 Panel1里 却在form1内findcontrol 那当然find不到了
      

  4.   

    FindControl里面的 是 id  不是 clientid 你说的是 clientid 变化了
    ---
    既是要如何??
      

  5.   

    动态生成的控件是不能在后台用FindControl找得到的,只能用
    Request.Form的方式,你上面的Request.Form["cc"]其中cc肯定不是你前台的ID值,得到前台ID值的方法是右键查看源码,在源码中看到的ID值才是你要的ID值
      

  6.   

    Panel1.Controls.Add(cc)不是得放在最后面吗
      

  7.   

    不是这个原因,因为我动态生成了多个Panel,所以我找控件用了form1,其他的控件,如textbox,checkbox都可以正常的找到,这个我也试了换成add这个checklistbox的也find不到...
      

  8.   

    既然知道了clientid了,干脆在前台用JS的document.getElementById()来实现?
    不知道行不行,呵呵,只是发表下自己的意见关注
      

  9.   

    Panel1.Controls.Add(cc) 确实应该放最后,可还是出错~~~
      

  10.   

    可能是:
    CheckBoxList cc = new CheckBoxList();
    位置有关。在哪里生成?
      

  11.   

    CheckBoxList eee = (CheckBoxList)form1.FindControl("cc");
    ========
    在你执行这句之前, 确保动态添加 CheckBoxList 的那段代码【已经执行】!!!记住:
    动态创建控件时的原则是:页面回发的时候,动态创建控件的代码【同样要执行】!否则之前请求创建的控件已经不再存在!
    你的问题,与客户端呈现的 html id 无关!
      

  12.   

    动态加载控件的代码,是放在Page_Load的if (!IsPostBack)中了,那个动态的当然己经加载了,并已经呈现在aspx页面上了
      

  13.   

    能说一下,如何解决的吗?我也遇到这个类似问题了。我是做一个考试系统,选项中有单选,也有多选。可是当提交时,出现一个这样的错误:
    startIndex 不能大于字符串长度。
    参数名: startIndex 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ArgumentOutOfRangeException: startIndex 不能大于字符串长度。
    参数名: startIndex源错误: 执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。  堆栈跟踪: 
    [ArgumentOutOfRangeException: startIndex 不能大于字符串长度。
    参数名: startIndex]
       System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy) +2915211
       System.Web.UI.WebControls.CheckBoxList.LoadPostData(String postDataKey, NameValueCollection postCollection) +54
       System.Web.UI.WebControls.CheckBoxList.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection) +11
       System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +353
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1575