首页蓝耳朵|小小蓝耳朵广州图书馆外文室英语儿童读物资源介绍网佛教青年之友旧版收集永硕E盘Phonics Short Vowels Game 
在GridView里用CheckBox控制同行TextBox的disabled属性
所属栏目:ASP.NET(webform)  时间:2009-06-02 17:56  作者:狼子

记录这个,是因为一开始的时候,我想的方法很复杂,我是说,很复杂,就是很容易想到,如果熟悉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";
                }
            }
        }
    }
}

小楼宝宝的涂鸦花花(Imitater)的博客起名称骨测字皖ICP备06000023号-17