记录这个,是因为一开始的时候,我想的方法很复杂,我是说,很复杂,就是很容易想到,如果熟悉DOM,要做这个功能,很容易会想到取checkbox的父级是td,再父级是tr,然后在tr中取下一个td。。。。我这样想了,我也这样做了,测试到最后,我头大了
在从aspx页面生成的HTML源代码里里检查脚本出错的时候,我突然想到现在这个办法的,就是借checkbox的id,取出其它控件的id,这个和asp.net的服务器控件在解析成HTML代码流时的命名有关,比如下面这一段代码,一个很普通的带CheckBox的GridView代码
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="Sds1" OnRowDataBound="GridView1_RowDataBound">
<Columns>
<asp:TemplateField HeaderText="priceID">
<HeaderTemplate>
<span title="全选/全消"><input type="checkbox" onclick="selectAllRow(this.checked);" /></span>
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server" />
</ItemTemplate>
<ItemStyle CssClass="tc w60" />
</asp:TemplateField>
<asp:BoundField DataField="PayTypeSortName" HeaderText="描述"></asp:BoundField>
<asp:TemplateField HeaderText="字段1">
<ItemTemplate>
<asp:TextBox ID="TbCol1" runat="server" Text='<%# Eval("Col1") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="字段2">
<ItemTemplate>
<asp:TextBox ID="TbCol2" runat="server" Text='<%# Eval("Col2") %>'></asp:TextBox>
</ItemTemplate>
</Columns>
</asp:GridView>
这一段代码运行后的效果图是这个

查看页面源文件可以看到,第一行三个服务器控件(CheckBox1, TbCol1, TbCol2)的ClientID分别是
ctl00_Cph_GridView1_ctl02_CheckBox1
ctl00_Cph_GridView1_ctl02_TbCol1
ctl00_Cph_GridView1_ctl02_TbCol2
ctl00是使用母版后自动生成的前缀,Cph是母版中设置的contentplaceholder的ID,GridView1是控件ID,ctl02是指GridView1下的第2个子控件,我想这个是从GridView内部结构计算的,Header可能是第1个,应该是从0开始计算,就是,我没有找到Title属性,不知道PageRow算不算,反正第一行数据,是从2开始,剩下的最后一部分,就是我们要用的服务器控件的ClientID了
所以,如果可以得到checkbox的id,同一行,甚至不同行,只需要知道相隔了多少行的任何一个服务器控件的id,都可以用replace得到
下面是我写的脚本,用checkbox控制TbCol1和TbCol2的disabled属性和底色
//选择或取消一行
function selectOneRow(cb)
{
var objM, objP, mName, pName, cName;
cName = cb.id;
mName = cName.replace("CheckBox1", "TbCol1");
pName = cName.replace("CheckBox1", "TbCol2");
objM = document.getElementById(mName);
objP = document.getElementById(pName);
if(objM && objP)
{
var selectRow = !cb.checked;
objM.disabled = selectRow;
objP.disabled = selectRow;
if(selectRow)
{
objM.style.backgroundColor = "#CCCCCC";
objP.style.backgroundColor = "#CCCCCC";
}
else
{
objM.style.backgroundColor = "#FFFFFF";
objP.style.backgroundColor = "#FFFFFF";
}
}
}
在cs页面里,要为每一行CheckBox添加客户端事件
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType.Equals(DataControlRowType.DataRow))
{
((CheckBox)e.Row.FindControl("CheckBox1")).Attributes.Add("onclick", "selectOneRow(this);");
}
}
把头部的全选和全消的脚本也记录下来,这里我直接用了aspnetForm,这是Form1默认生成的ID,也可以用document.forms[0]的,因为在aspx页面里,只可以包含一个Form
//全选或全消
function selectAllRow(isChecked)
{
var objCheckBox, objTextBox;
for(var i = 0; i < aspnetForm.length; i++)
{
if(aspnetForm.elements[i].type == "checkbox")
{
objCheckBox = aspnetForm.elements[i];
if(objCheckBox.name.indexOf("GridView1") > -1 && objCheckBox.name.indexOf("CheckBox1") > -1)
{
objCheckBox.checked = isChecked;
}
}
if(aspnetForm.elements[i].type == "text")
{
objTextBox = aspnetForm.elements[i];
if(objTextBox.name.indexOf("GridView1") > -1 && (objTextBox.name.indexOf("TbCol1") > -1 || objTextBox.name.indexOf("TbCol2") > -1))
{
if(isChecked)
{
objTextBox.disabled = false;
objTextBox.style.backgroundColor = "#FFFFFF";
}
else
{
objTextBox.disabled = true;
objTextBox.style.backgroundColor = "#CCCCCC";
}
}
}
}
}