Referencing CheckBoxes in GridView, Repeater and DataList controls

If you want to find which CheckBoxes were selected in a multiple record DataBound control, the way that you you do it depends on the type of control you use. These examples demonstrate a CheckBox control being added to a GridView, Repeater and a DataList. For simplicity, I have placed all three controls on the same page, and used the Access version of theNorthwind database. One AccessDataSource control is used to bind the results of "SELECT [CategoryID], [Description], [CategoryName] FROM [Categories]" to all three controls.

[aspx]
<asp:Literal ID="RptLiteral" runat="server" /><br />
<asp:Literal ID="GrdLiteral" runat="server" /><br />
<asp:Literal ID="DlLiteral" runat="server" /><br />

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="AccessDataSource1">
  <ItemTemplate>
    <div>
      <asp:CheckBox ID="CategoryID" runat="server" Text='<%# Eval("CategoryID") %>' />
    </div>
  </ItemTemplate>
</asp:Repeater>
                    
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="CategoryID"
     DataSourceID="AccessDataSource1">
  <Columns>
    <asp:TemplateField HeaderText="CategoryID" InsertVisible="False">
      <ItemTemplate>
         <asp:CheckBox ID="CategoryID" runat="server" Text='<%# Eval("CategoryID") %>' />
       </ItemTemplate>
    </asp:TemplateField>
    <asp:BoundField DataField="Description" HeaderText="Description" />
      <asp:BoundField DataField="CategoryName" HeaderText="CategoryName" />
  </Columns>
</asp:GridView>

<asp:DataList ID="DataList1" runat="server" DataKeyField="CategoryID" 
     DataSourceID="AccessDataSource1">
  <ItemTemplate>
     CategoryID:
       <asp:CheckBox ID="CategoryID" runat="server" Text='<%# Eval("CategoryID") %>' /><br />
     Description:
       <asp:Label ID="DescriptionLabel" runat="server" Text='<%# Eval("Description") %>' />
	   <br />
     CategoryName:
       <asp:Label ID="CategoryNameLabel" runat="server" Text='<%# Eval("CategoryName") %>' />
	   <br /><br />
  </ItemTemplate>
</asp:DataList></div>

<asp:Button ID="Button1" runat="server" Text="Button" />
<asp:AccessDataSource ID="AccessDataSource1" runat="server" DataFile="~/App_Data/Northwind.mdb"
  SelectCommand="SELECT [CategoryID], [Description], [CategoryName] FROM [Categories]" />

GridView

The GridView contains a collection of GridViewRow objects. Once you reference the collection, and iterate through it, you can use the FindControl method of the GridViewRow to access controls:

[C#]
string Grd = "GridView Items Checked:<br />";
foreach (GridViewRow gvr in GridView1.Rows)
{
CheckBox chk = (CheckBox)gvr.FindControl("CategoryID");
if (chk.Checked)
  {
    Grd += (chk.Text + "<br />");
  }
}
GrdLiteral.Text = Grd;
[VB]
Dim Grd As String = "GridView Items Checked:<br />"
For Each gvr As GridViewRow In GridView1.Rows
  Dim chk As CheckBox = DirectCast(gvr.FindControl("CategoryID"), CheckBox)
  If chk.Checked Then
    Grd += (chk.Text + "<br />")
  End If
Next
GrdLiteral.Text = Grd

Repeater

The Repeater has an Items collection. In this example, the Count property of the Items collection is retrieved and used with a for.. next loop [C#] While... End While [VB] to iterate the collection. The FindControl method of each Item is used to reference the CheckBox again:

[C#]
string Rpt = "Repeater Items Checked:<br />";
for (int i = 0; i < Repeater1.Items.Count; i++)
{
  CheckBox chk = (CheckBox)Repeater1.Items[i].FindControl("CategoryID");
  if (chk.Checked)
  {
    Rpt+=(chk.Text + "<br />");
  }
}
RptLiteral.Text = Rpt;
[VB]
Dim Rpt As String = "Repeater Items Checked:<br />"
Dim i As Integer = 0
While i < Repeater1.Items.Count
  Dim chk As CheckBox = DirectCast(Repeater1.Items(i).FindControl("CategoryID"), CheckBox)
  If chk.Checked Then
    Rpt += (chk.Text + "<br />")
  End If
  i += 1
End While
RptLiteral.Text = Rpt

DataList

The DataList also has an Items collection, but this time, foreach [C#] For Each [VB] is used to iterate the collection. for... next could just as easily be used as in the Repeater example:

[C#]
string Dl = "Datalist Items Checked:<br />";
foreach (DataListItem dli in DataList1.Items)
{
  CheckBox chk = (CheckBox)dli.FindControl("CategoryID");
  if (chk.Checked)
  {
    Dl += (chk.Text + "<br />");
  }
}
DlLiteral.Text = Dl;
[VB]
Dim Dl As String = "Datalist Items Checked:<br />"
For Each dli As DataListItem In DataList1.Items
  Dim chk As CheckBox = DirectCast(dli.FindControl("CategoryID"), CheckBox)
  If chk.Checked Then
    Dl += (chk.Text + "<br />")
  End If
Next
DlLiteral.Text = Dl