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

Date Posted:
Last Updated:
Posted by:
Total Views to date: 67730

6 Comments

- Mohan

Hi
i am facing problem in retrieving the status of checkboxes
every time they showing as cheeck = false
here my code
.........
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<asp:CheckBox ID="HeaderLevelCheckBox" runat="server" onclick="javascript:HeaderClick(this);" />
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server" Text='<%# Eval("APPROVAL_STATUS") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="EMP_ID" HeaderText="EmpID" ReadOnly="True" Visible="False" />
<asp:BoundField DataField="EMP_NAME" HeaderText="Employee Name" ReadOnly="True" />
......................
...........................

For Each gvRow As GridViewRow In GV.Rows
If gvRow.RowType = DataControlRowType.DataRow Then
Dim chkItem As CheckBox = DirectCast(gvRow.FindControl("CheckBox1"), CheckBox)
If chkItem.Checked = True Then
' do something
End If
End If
Next

any help would highly be appreciated

- Ram

Greate post..
FindControl method not working for html controls(in my case it is, select control) in Datalist. I have placed Htmlselect control in one colunm but i unable to find it in foreach loop datalistitems.

- Tsubasa

This is an excellent example that I am also using in one of my programs for selecting and inserting records. I have yet to develop the code for inserting after selecting, but that should not be to hard for me.

Excellent work!

-Tsu

- Mark

thanks! it's realy cool .
:)

- somasekhar akiri

nice article

- mrityunjay

it's very nice and really helpful.
Add your comment

If you have any comments to make about this article, please use this form to do so. Make sure that your comment relates specifically to the article above. More general comments can be posted through the form on the Contact page.

Please note, all comments are moderated, and I end up deleting quite a lot. The kind of things that will ensure your comment is deleted without ever seeing the light of day are as follows:

  • Requests to fix your code (post a question to forums.asp.net instead, please)
  • Gratuitous links to your own site or product
  • Anything abusive or libellous
  • Spam

I do not pass email addresses on to spammers, so a valid one will assist me in responding to you personally if required.

Recent Comments

hosein ey 2/25/2015 1:56 PM
In response to ASP.NET MVC 5 with EF 6 - Working With Files
tnx for this article do you think next version of entityframework support's the sql server and ?...

Saywer Ford 2/25/2015 5:15 AM
In response to Optimising ASP.NET Web Pages Sites - Bundling And Minification
Great Article. I did everything right and working fine. How about page specific js files. Lets I...

Saravanan 2/24/2015 10:54 AM
In response to Optimising ASP.NET Web Pages Sites - Bundling And Minification
Hi, Great article about the Bundling and minification. Regards the caching as you mentioned the...

Justin 2/24/2015 10:43 AM
In response to Scheduled Tasks In ASP.NET With Quartz.Net
I'm having the same problem as Ingmar. Everything is working fine locally in Visual Studio, but I it...

Logan Mudlo 2/23/2015 4:59 PM
In response to WebMatrix - A First Application
Is there a way to prevent the automatic close on a Database.Open() call?...

Mog0 2/23/2015 11:16 AM
In response to ASP.NET MVC 5 with EF 6 - Working With Files
Probably a silly question but why did you disable cascade delete and implement it yourself?...

Jose-Maria 2/19/2015 3:29 PM
In response to Migrating From Razor Web Pages To ASP.NET MVC 5 - Views and Controllers
Just great ! Many thanks Mike....

Satyabrata Mohapatra 2/19/2015 12:02 PM
In response to Migrating From Razor Web Pages To ASP.NET MVC 5 - Views and Controllers
This is great!!...

Ryan Helmoski 2/19/2015 10:24 AM
In response to Conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value
Thank you!...

Harsha 2/19/2015 8:27 AM
In response to iTextSharp - Adding Text with Chunks, Phrases and Paragraphs
Hi, Can text area be created so that I can type text in the area in pdf document? We have Add text...