嵌套在gridview中checkbox怎样让用户只能单选,就像radiobutton一样,一次只能选择一个。 
 CheckBox cb = (CheckBox)row.FindControl("CheckBox1");                         count = row.RowIndex;                         if (cb != null && cb.Checked) 
                        { 
                            GridViewRow rows = (GridViewRow)cb.Parent.Parent; 
                            //count++; 
                            this.masid = Convert.ToString(GridView1.DataKeys[row.RowIndex].Value); 
                            Session["masid"] = this.masid; 
                            for (int num = 0; num  < GridView1.Rows.Count; num++) 
                            { 
                                if (count != num) 
                                { 
                                    rows = GridView1.Rows[num]; 
                                    cb = (CheckBox)rows.FindControl("cb"); 
                                    cb.Checked = false; 
                                } 
                            } 
                        } 
我的代码是这样的 ,可是运行后它在cb.Checked = false;报错,错误报告为:未将对象引用到实例。 
在即时窗口里可以看到cb为null 
可是 同样在即时窗口中cb = (CheckBox)rows.FindControl("cb");都有值 
请问是怎么回事 
这个功能还没有其他更好的办法解决!(不使用radiobutton的情况下) 

解决方案 »

  1.   

    CheckBox cb = (CheckBox)row.FindControl("CheckBox1");  
    这句明显错的,这个row是什么的row?
    这里获取不到下面当然是“未将对象引用到对象的实例”
      

  2.   

    function SignCheck(cbox)
    {
    var obj = document.getElementsByTagName("input");
    for (var i=0; i < obj.length; i++)
    {
    if(obj[i].type == "checkbox")
    {
    obj[i].checked = false;
    }
    var sid = cbox.id;
    document.getElementById(sid).checked = true;
    }
    }
    <asp:GridView ID="GridView1" runat="server">
                <Columns>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <input id="Checkbox1" type="checkbox" name="ck" onclick="SignCheck(this);" runat="server" />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
      

  3.   

    呵,刚写完一个,拿来跟你分享一下吧。
    <asp:TemplateField>
      <ItemStyle Width="2%" />
      <ItemTemplate>
        <input id="chkSelect" name="chkSelect" runat="server" type="checkbox" onclick="Check(this)" title="选中一条用于打印的记录" />
      </ItemTemplate>
    </asp:TemplateField>     <script type="text/javascript" language="javascript">
            var checkObj;
            function Check(onClickObj)   
           {   
                    
                if(checkObj!=null)
                {
                    checkObj.checked=false;
                }
                if(checkObj==onClickObj)
                {
                        onClickObj.checked=false;
                }
                else
                    onClickObj.checked=true;
                checkObj=onClickObj;    
             }   
        </script>
      

  4.   

    我在即时窗口中打印cb显示cb为false
    row是  foreach (GridViewRow row in GridView1.Rows)循环取出 的 
      

  5.   


    我在前台用的是服务器控件 
    服务器控件没有onclick属性的
      

  6.   

    因为我要执行checkbox的CheckBox1_CheckedChanged事件 ,所以我要写在后台啊 
      

  7.   

    最好的办法是用js,省得在服务器上回发:<script language="javascript">
    function ChangeChk(ctl)
    {
    var theBox=ctl;   
             var elem=theBox.form.elements;
              for(i=0;i<elem.length;i++)
              {
         if(elem[i].type=='checkbox')
         {
                   if(elem[i].id==theBox.id)
                   {
                      elem[i].checked=true;
                   }
                   else
                   {
     elem[i].checked=false;
                   }
                  }
                 }
         }
    </script>
    调动的时候:
    <asp:CheckBox id="CheckBox1" onclick="javascript:ChangeChk(this)" runat="server"></asp:CheckBox>
      

  8.   

    执行CheckBox1_CheckedChanged是为了取到选中的值是吗?
      

  9.   

    这句代码有问题
     cb = (CheckBox)rows.FindControl("cb");  
      

  10.   

    <input type="checkbox" id="Checkbox1" onserverchange="Checkbox1_ServerChange" runat="server" />
      

  11.   

    <asp:TemplateField> 
       <ItemStyle Width="2%" /> 
       <ItemTemplate> 
         <input id="chkSelect" name="chkSelect" runat="server" type="checkbox" onserverchange="Checkbox1_ServerChange"  onclick="Check(this)" title="选中一条用于打印的记录" /> 
       </ItemTemplate> 
    </asp:TemplateField>  
    <input type="text" id="hidId" >
         <script type="text/javascript" language="javascript"> 
            var checkObj; 
            function Check(onClickObj)    
           {    
                     
                if(checkObj!=null) 
                { 
                    checkObj.checked=false; 
                } 
                if(checkObj==onClickObj) 
                { 
                        onClickObj.checked=false; 
                } 
                else 
                {
                    onClickObj.checked=true; 
                    document.getElementById("").value=
                }
                checkObj=onClickObj;     
             }    
         </script>
    html控件和web服务控件是可以共通的,html控件在转换成web控件后,跟后者没有多大区别
      

  12.   

    应该是 cb = (CheckBox)rows.FindControl("CheckBox1");  
      

  13.   

    web        checkbox  是 CheckBox1_CheckedChanged
    html       checkbox  先执行 click 再执行onserverchange(后台)
      

  14.   

                    <asp:GridView ID="gvUser" runat="server" AutoGenerateColumns="False" AllowPaging="true" 
                        DataKeyNames="Studentid"  OnRowDeleting="gvUser_RowDeleting" OnRowDataBound="gvUser_RowDataBound" >这儿放你的主键就行了
      

  15.   

    onclick="Check(this)"   this 就是你所选的checkbox这样你就不用每次都去循环判断选中哪一行了。
      

  16.   

    你如果要用web服务端的checkbox也可以,在GridView 的RowDataBound事件里绑定脚本click也行
        protected void gvUser_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                 CheckBox chkSelect = (CheckBox)gvUser.Rows[i].FindControl("chkSelect");
                 chkSelect.Atrributes.add("onclick","Check(this);");
            }
        }象选择这样的操作没有必要回发到服务器去判断,当然也没有必要在js作循环。
      

  17.   

    要求单选还不用radiobutton? 何意?
      

  18.   

          <script type="text/javascript" language="javascript">  
            var checkObj;  
            function Check(onClickObj)     
           {     
                      
                if(checkObj!=null)  
                {  
                    checkObj.checked=false;  
                }  
                if(checkObj==onClickObj)  
                {  
                        onClickObj.checked=false;  
                }  
                else  
                { 
                    onClickObj.checked=true;  
                    document.getElementById("").value= 
                } 
                checkObj=onClickObj;      
             }     
          </script> 
    你试试这个,这个不用作循环一样也可以实现