65.9K
CodeProject 正在变化。 阅读更多。
Home

在 DataGrid 控件中使用 CheckBox 选择记录

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.32/5 (27投票s)

2004年7月4日

CPOL

3分钟阅读

viewsIcon

302659

downloadIcon

3620

本文介绍了如何在 Datagrid 控件中使用 CheckBox 来选择记录,类似于邮箱中的功能。

引言

问题可以表述如下:

  1. 应该在标题行中有一个复选框,用于“全选”和“取消全选”。
  2. 应在每个记录旁边都有复选框,用于单独选择记录。
  3. 如果所有记录都被单独选中,则标题行中的“全选”复选框也应被选中。
  4. 应该有一个 DataGrid 控件外部的按钮,用于检索选中的记录。

Sample screenshot

解决方案

在 DataGrid 中检索到的记录来自我创建的一个表。在 SQL Server 中创建表的脚本如下:

CREATE TABLE [dbo].[Anz_Contacts] (
       [Id] [int] IDENTITY (1, 1) NOT NULL ,
       [FirstName] [char] (10)  NULL ,
       [LastName] [char] (10)  NULL ,
       [Designation] [varchar] (50)  NULL       
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Anz_Contacts] WITH NOCHECK ADD 
       CONSTRAINT [PK_Anz_Contacts] PRIMARY KEY  CLUSTERED 
       (
              [Id]
       )  ON [PRIMARY] 
GO

Sample screenshot

Page_Load 事件中,将 DataGrid 绑定到该表。绑定 DataGrid 的代码如下所示:

注意:请根据您的 DBMS 修改连接字符串,cnnDBmyDataGrid 是受保护的成员变量。

private void Page_Load(object sender, System.EventArgs e)
{
    cnnDB = new SqlConnection("server=HOME;user id=sa;password=;database=Contacts");
    if (!IsPostBack)
        bindGrid();
}
private void bindGrid()
{
    SqlDataAdapter da = new SqlDataAdapter("select * from Anz_Contacts",cnnDB);
    DataSet ds = new DataSet();
    da.Fill(ds, "Employees");
    myDataGrid.DataSource=ds.Tables["Employees"].DefaultView;
    myDataGrid.DataBind();
}

现在我们已经了解了如何将数据绑定到网格,接下来将看看 DataGrid 的 HTML 是什么样的:

<form id="Form1" name="Form1" method="post" runat="server">
<ASP:DATAGRID id="myDataGrid" 
runat="server" 
AutoGenerateColumns="false" 
HeaderStyle-BackColor="#aaaadd" 
Font-Size="8pt" 
Font-Name="Verdana" 
CellSpacing="0" 
CellPadding="3" 
ShowFooter="true" 
BorderColor="Black"
BackColor="AntiqueWhite" 
Width="600">
       <HeaderStyle BackColor="NavajoWhite"></HeaderStyle>
       <FooterStyle BackColor="NavajoWhite"></FooterStyle>
       <Columns>
              <asp:TemplateColumn HeaderText="contract">
                     <HeaderTemplate>
       <input type="checkbox" id="checkAll"
 onclick="CheckAll(this);" runat="server" name="checkAll">
                     </HeaderTemplate>
                     <ItemTemplate>
                           <input type="checkbox" runat="server" id="EmpId"
 onclick="CheckChanged();" checked='false' name="EmpId" />
                     </ItemTemplate>
                           </asp:TemplateColumn>
              <asp:TemplateColumn HeaderText="Id">
                     <ItemTemplate>
                           <asp:Label id="Id" Text='<%# 
DataBinder.Eval(Container.DataItem, "Id") %>' runat="server" />
                     </ItemTemplate>
              </asp:TemplateColumn>
              <asp:BoundColumn DataField="FirstName"
       HeaderText="FirstName"></asp:BoundColumn>
              <asp:BoundColumn DataField="LastName" 
HeaderText="LastName"></asp:BoundColumn>
              <asp:BoundColumn DataField="Designation" 
HeaderText="Designation"></asp:BoundColumn>
       </Columns>
</ASP:DATAGRID>
</form >

注意 DataGrid 中的 TemplateColumnTemplateColumn 代表 DataGrid 控件的一种列类型,允许您自定义列中控件的布局。我使用模板列在标题和项模板中渲染复选框。我使用的是 HtmlInputCheckBox 控件,而不是 <asp:CheckBox> 控件。这是因为选中和取消选中完全是客户端过程,这里不需要服务器端操作。标题中的复选框在被单击时将调用客户端脚本函数 CheckAll(),而记录项中的复选框将调用 CheckChanged() 函数。

我使用第二个 TemplateColumn 来包含一个 Label 控件,以显示表中的 ID 列。这个 Label 控件将帮助我们在以后获取选中记录的 ID。其余列使用 DataGridBoundColumn 绑定了 FirstNameLastNameDesignation

现在我们来看看用于操作选中和取消选中的客户端 JavaScript 函数。

如果我们使用 VS.NET 和代码隐藏模型,最好使用页面的 RegisterClientScriptBlock 方法来在页面中输出客户端脚本块。客户端脚本注册在页面加载时完成。因此,我们可以在页面的 Page_load 事件中编写相应的代码。

JavaScript 函数 CheckAll() 如下所示。为了提高可读性,我使用了字符串连接来构建脚本字符串。您可以使用 StringBuilder 类来实现更高效的连接。

string strScript;
strScript= " <script language=JavaScript>                             ";
strScript+=" function CheckAll( checkAllBox )                         ";
strScript+=" {                                                                  ";
strScript+=" var frm = document.Form1;                               ";
strScript+="  var ChkState=checkAllBox.checked;                   ";
strScript+="  for(i=0;i< frm.length;i++)                                 ";
strScript+="  {                                                                 ";
strScript+="         e=frm.elements[i];                                   ";
strScript+="        if(e.type=='checkbox' && e.name.indexOf('Id') != -1)";
strScript+="            e.checked= ChkState ;                        ";
strScript+="  }                                                               ";
strScript+=" }                                                                ";
strScript+="  </script>                                                     ";
if(!this.IsClientScriptBlockRegistered("clientScriptCheckAll"))
       this.RegisterClientScriptBlock("clientScriptCheckAll", strScript);

在上面的脚本中,我们首先检查了触发事件的 CheckBox 的状态,即标题 CheckBox。接下来,我们遍历表单元素,查找所有名称中包含“Id”的 CheckBox 控件,并将这些 CheckBox 的值设置为与标题 CheckBox 匹配。

当每个记录项中的复选框被选中或取消选中时调用的 JavaScript 函数如下。在这里,我们检查所有记录是否都被选中,以确定标题中 checkAll 复选框的选中状态。

strScript="";
strScript= "<script language=JavaScript>                              ";
strScript+="function CheckChanged()                                   ";
strScript+="{                                                                   ";
strScript+="  var frm = document.Form1;                              ";
strScript+="  var boolAllChecked;                                         ";
strScript+="  boolAllChecked=true;                                       ";
strScript+="  for(i=0;i< frm.length;i++)                                 ";
strScript+="  {                                                                 ";
strScript+="    e=frm.elements[i];                                        ";
strScript+="  if ( e.type=='checkbox' && e.name.indexOf('Id') != -1 )";
strScript+="      if(e.checked== false)                                  ";
strScript+="      {                                                             ";
strScript+="         boolAllChecked=false;                               ";
strScript+="         break;                                                    ";
strScript+="      }                                                              ";
strScript+="  }                                                                  ";
strScript+="  for(i=0;i< frm.length;i++)                                  ";
strScript+="  {                                                                  ";
strScript+="    e=frm.elements[i];                                         ";
strScript+="    if ( e.type=='checkbox' && e.name.indexOf('checkAll') != -1 )";
strScript+="    {                                                            ";
strScript+="      if( boolAllChecked==false)                         ";
strScript+="         e.checked= false ;                                ";
strScript+="         else                                                    ";
strScript+="         e.checked= true;                                  ";
strScript+="      break;                                                    ";
strScript+="    }                                                             ";
strScript+="   }                                                              ";
strScript+=" }                                                                ";
strScript+=" </script>                                                     ";
if(!this.IsClientScriptBlockRegistered("clientScriptCheckChanged"))
       this.RegisterClientScriptBlock("clientScriptCheckChanged", strScript);

现在,剩下的就是使用 DataGrid 外部的一个按钮来检索选中的记录。将此代码添加到包含 DataGrid 的表单中。

<asp:button id="selBtn" onclick="View_Selected" runat="server" 
name="selBtn" text="Show Selection"></asp:button>

按钮的事件处理程序

public void View_Selected(object sender, EventArgs e)
{
    foreach( DataGridItem di in myDataGrid.Items )
    {
        HtmlInputCheckBox chkBx = (HtmlInputCheckBox)di.FindControl("EmpId") ;
        if( chkBx !=null && chkBx.Checked )
        {
            Label lbl = (Label)di.FindControl("Id");
            Response.Write( lbl.Text +"<br>" );
        }
    }
}

我们遍历 DataGrid 中包含的每个 DataGridItem,查找 HtmlInputCheckBox 控件,然后检查其值。如果被选中,我们将查找 DataGridItem 中的 Label 控件以获取“ID”字段。一旦获得 ID,我们将它写入 Response

© . All rights reserved.