2010-06-29 34 views
0

我将动态绑定到GridView控件的列表中。 网格视图控件位于包装在asp:UpdatePanel(Ajax)中的asp.net页面中。 第一列包含一个复选框控件。 此列中只能选中一个复选框。 如果用户选中一个复选框,则所有其他复选框都必须取消选中。带有复选框列的GridView。客户端脚本取消选中除当前复选框之外的所有内容

我想实现这个使用客户端脚本没有成功。 在GridView的RowDatabound事件的处理程序中,试图将属性添加到单元格中包含的CheckBox。

protected void ErrorGridView_RowDatabound(object sender, GridViewRowEventArgs e) 
    { 

    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 

     if(e.Row.Cells[0].HasControls()) 
     { 
      foreach (var control in e.Row.Cells[0].Controls) 
      { 
       if (!(control is CheckBox)) continue; 

       var checkBox = (CheckBox)control; 
       checkBox.Attributes.Add("CheckedChanged", "errorCheckChanged"); 
       return; 
      } 
     }   
    } 

客户端脚本登记在Page_Load事件处理程序 - 如下:

如果(Page.ClientScript.IsClientScriptBlockRegistered( “ErrorsCheckBoxHandler”)!) Page.ClientScript.RegisterClientScriptBlock(的GetType (),“ErrorsCheckBoxHandler”,“function errorCheckChanged(){window.alert(\”here \“);}”);

问题是,当单击任何复选框时,函数不会被调用。希望有人能够阐明我在这里错过了什么?

另外,执行取消选中目标列中选中的任何其他复选框的最佳方式是什么?

我的计划是更改'errorCheckChanged'函数以获取一个参数(复选框对象)。我会改变上面的代码;添加到属性添加签名:

checkBox.Attributes.Add( “的CheckedChanged”, “errorCheckChanged()”);

希望,我会然后能够:
(1)判断是否该复选框状态“检查”。 (如果它是'检查',然后继续下面的步骤)
(2)找到复选框parent(=单元格),然后确定受影响的GridView行。
(3)遍历所有行,将复选框设置为“Checked = false”,但当前行除外。

这会被认为是正确的做法吗?

感谢

格兰特

回答

1

您还可以在设计时添加onclick事件checkbox

<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="chkSelect" onclick="errorCheckChanged(this)" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>

而且JavaScript看起来像

function errorCheckChanged(chkBox){ 
    var gridView = document.getElementById('<% =GridView1.ClientID %>'); 
    var Elements = gridView.getElementsByTagName('input'); 

    for(var i = 0; i < Elements.length; i++){ 
     if(Elements[i].type == 'checkbox' && Elements[i].id != chkBox.id && chkBox.checked) 
      Elements[i].checked = false; 
    } 
} 
+0

伟大的东西Selva。继这个概念之后,除了我无法得到-getElementById('<%= myGridView.ClientID%>'),我必须硬编码值。帮助。 – 2010-06-30 20:16:54

+0

这不允许多选复选框。如何启用多个检查? – rickyProgrammer 2015-06-16 09:57:58

+1

@rickyProgrammer OP的要求是检查选中的“CheckBox”并取消其余的检查。如果你想多次检查,使用这个。 'function errorCheckChanged(){var _ gridView = document.getElementById('<%= GridView1.ClientID%>'); var Elements = gridView.getElementsByTagName('input');对于(var i = 0; i 2015-06-16 11:55:07

0

使用onclick属性,而不是CheckChanged。我不认为这是一个有效的js事件。所以

checkBox.Attributes.Add("onclick", "errorCheckChanged(this);"); 

得到一个复选框列表,你可以做

JS:

var grid = document.getElementById('<% =GridView1.ClientID %>'); 
var checks = grid.getElementsByTagName('input'); 

你必须检查type属性,以确保它是一个复选框,或者你可以给所有的复选框都是一个特定的类来对它们进行逻辑分组。无论如何,你可以检查你的click ed元素id列表。

+0

感谢您的快速回复。我第一次尝试使用'onclick'事件。只有在注册脚本块时输入的详细信息才能通过浏览器中的查看 - >源查看。即使我能够触发事件(当在实际的列上注册onclick事件(而不是在列中的复选框)时,源代码也不会显示每行的属性,我认为这是因为UpdatePanel加密了信息。 – 2010-06-29 21:34:48

+0

一般来说,你在查看源代码时看到的是最初加载的内容,之后任何javascript的改变都不会被应用,如果你使用IE8,你可以调出开发者工具窗口(f12),它会给你一个html视图,并在ajax请求完成后,您可以刷新html内容(f5) – lincolnk 2010-06-29 21:38:55

+0

我删除了面板以查看Htlm,我没有想过在开发人员工具窗口中刷新html视图。将来会这样做 – 2010-07-01 16:42:37

相关问题