带复选框列的GridView。客户端脚本取消选中除当前复选框以外的所有内容

时间:2010-06-29 21:18:23

标签: asp.net javascript asp.net-ajax

我将一个键入的列表动态绑定到GridView控件。 Grid View Control位于一个asp.net页面中,该页面包含在asp:UpdatePanel(Ajax)中。 第一列包含复选框控件。 在此列中只能选中一个复选框。 如果用户选中了复选框,则必须取消选中所有其他复选框。

我正在尝试使用客户端脚本实现此目的但没有成功。 在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事件处理程序上注册 - 如下所示:

  

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

问题是单击任何复选框时不会调用该函数。希望有人能说清楚我在这里失踪了什么?

此外,执行取消选择目标列中检查的任何其他复选框的最佳方法是什么?

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

  

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

希望我能够:
(1)确定复选框状态是否为“已检查”。 (如果'已'检查',则继续执行以下步骤)
(2)找到复选框parent(= cell),然后确定受影响的GridView Row (3)循环遍历所有行,将复选框设置为'Checked = false',当前行除外。

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

谢谢

捐赠

2 个答案:

答案 0 :(得分: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; } } 看起来像

{{1}}

答案 1 :(得分: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。