VS2008脚本调试的一点经验

今天在做一个为GridView添加Checkboxes的小练习时,想在HeaderTemplate里放置一个checkbox,并且用脚本控制ItemTemplate里的checkbox全选或全不选,主要代码如下:
ContractedBlock.gif ExpandedBlockStart.gif Code
<script type="text/javascript">
        function ChangeCheckBoxState(id, checkState) {
            var cb 
= document.getElementById(id);
            
if (cb != null)
                cb.
checked = checkState;
        }
        function ChangeAllCheckBoxState(checkState) {
            
if (CheckBoxIDs != null) {
                
for (var i = 0; i < CheckBoxIDs.length; i++)
                    ChangeCheckBoxState(CheckBoxIDs[i], checkState);
            }
        }
        function ChangeHeaderAsNeeded() {
            
if (CheckBoxIDs != null) {
                
for (var i = 1; i < CheckBoxIDs.length; i++) {
                    var cb 
= document.getElementById(CheckBoxIDs[i]);
                    
if (!cb.checked) {
                        ChangeCheckBoxState(CheckBoxIDs[
0], false);
                        
return;
                    }
                }
                ChangeCheckBoxState(CheckBoxIDs[
0], true);
            }
        }
    
</script>


<asp:TemplateField>
                    
<HeaderTemplate>
                        
<asp:CheckBox runat="server" ID="HeaderLevelCheckbox" />
                    
</HeaderTemplate>
                    
<ItemTemplate>
                        
<asp:CheckBox ID="ProductSelector" runat="server" />
                    
</ItemTemplate>
                
</asp:TemplateField>


protected void Products_DataBound(object sender, EventArgs e)
    {
        GridViewRow row 
= Products.HeaderRow;
        CheckBox cbHeader 
= (CheckBox)row.FindControl("HeaderLevelCheckbox");
        cbHeader.Attributes[
"onclick"= "ChangeAllCheckBoxState(this.checked);";
        List
<String> ArrayValues = new List<string>();
        ArrayValues.Add(String.Concat(
"'", cbHeader.ClientID, "'"));
        
foreach (GridViewRow grv in Products.Rows)
        {
            CheckBox cb 
= (CheckBox)grv.FindControl("ProductSelector");
            cb.Attributes[
"onclick"= "ChangeHeaderAsNeeded();";
            ArrayValues.Add(String.Concat(
"'", cb.ClientID, "'"));
        }
        CheckBoxIDsArray.Text 
= @"<script type=""text/javascript"">" + String.Concat("var CheckBoxIDs =  new Array(", String.Join(",", ArrayValues.ToArray()), ");"+ "</script>";
    }

在查看效果的时候发现了一个非常奇怪的现象:点击ItemTemplate里的一个checkbox时全部的checkbox会同时选中,这明显与实际期望产生了偏差,于是决定通过调试看看为啥出现了这个偏差,查了一下也没有显示处理这块的代码。郁闷了一会后,想到既然全部选中应该是调用了ChangeAllCheckBoxState()这个函数,但何时调用的呢,在脚本处放断点,结果显示运行也正常啊,貌似也没什么问题。于是又很失望,就在要放弃的时候突然发现ChangeAllCheckBoxState(CheckBoxIDs[0], false);这句代码,再一看ChangeAllCheckBoxState()没有两个参数的方法,赶紧把它改回来,再看效果时已经好用了。只是纳闷,调试脚本的时候明明没有合适的方法为什么不报错呢?

    个人总结:有时候我们不可过分相信脚本调试器,在遇到异常的时候还是应该仔细分析可能出错的原因。

转载于:https://www.cnblogs.com/Hard/archive/2009/03/18/1415401.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值