嵌套在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的情况下)
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的情况下)
这句明显错的,这个row是什么的row?
这里获取不到下面当然是“未将对象引用到对象的实例”
{
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>
<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>
row是 foreach (GridViewRow row in GridView1.Rows)循环取出 的
我在前台用的是服务器控件
服务器控件没有onclick属性的
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>
cb = (CheckBox)rows.FindControl("cb");
<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控件后,跟后者没有多大区别
html checkbox 先执行 click 再执行onserverchange(后台)
DataKeyNames="Studentid" OnRowDeleting="gvUser_RowDeleting" OnRowDataBound="gvUser_RowDataBound" >这儿放你的主键就行了
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作循环。
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>
你试试这个,这个不用作循环一样也可以实现