SC-ML-SP
SC-ML-SP

Reputation: 29

select all rows in gridview using checkbox and delete on button click

I have a ckeck box field in grid view header.On checking this Check box all the check boxes in grid view gets checked. Now i want to delete all the rows on button click.

Code for the check box in my aspx page is as follows:

 <HeaderTemplate>
       Select All: <asp:CheckBox ID="chkboxSelectAll"  AutoPostBack="true" OnCheckedChanged="chkboxSelectAll_CheckedChanged" 
       runat="server"/>
           </HeaderTemplate>
            <ItemTemplate>
            <asp:CheckBox ID="chkEmp" runat="server"></asp:CheckBox>
            </ItemTemplate></asp:TemplateField>

In my code behind i have tried this but its not working: also In my Grid view DataKeyNames="id" and bindgrid() method is working fine.

For selecting all rows:

 protected void chkboxSelectAll_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox ChkBoxHeader = (CheckBox)Grd.HeaderRow.FindControl("chkboxSelectAll");
        foreach (GridViewRow row in Grd.Rows)
        {
            CheckBox ChkBoxRows = (CheckBox)row.FindControl("chkEmp");
            if (ChkBoxHeader.Checked == true)
            {
                ChkBoxRows.Checked = true;
               }
} 

For deleting all selected rows

 protected void btn_click(object sender, EventArgs e)
{
    CheckBox ChkBoxHeader = (CheckBox)Grd.HeaderRow.FindControl("chkboxSelectAll");

    foreach (GridViewRow row in Grd.Rows)
    {
        // Only look in data rows, ignore header and footer rows
        if (row.RowType == DataControlRowType.DataRow)
        {
            CheckBox ChkBoxRows = (CheckBox)row.FindControl("chkEmp");

            if (ChkBoxHeader.Checked == true)
            {
                ChkBoxRows.Checked = true;

                var id = Grd.DataKeys[row.RowIndex].Value;
                SqlConnection con = new SqlConnection(constr);
                string qry = "delete from empdetail where id=@id";
                SqlCommand cmd = new SqlCommand(qry, con);
                cmd.Parameters.AddWithValue("@id", id);
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
                bindgrid();
            }

        }
    }
}

Please Help me. Error i got is "Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index"

Upvotes: 2

Views: 21001

Answers (2)

Code
Code

Reputation: 739

     <asp:GridView ID="GrdAtt" runat="server" CssClass="table table-small-font table-bordered table-striped" Font-Size="Small" EmptyDataRowStyle-ForeColor="#cc0000" HeaderStyle-Font-Size="10" HeaderStyle-Font-Names="Arial" HeaderStyle-Font-Italic="true"
                                                                                AutoGenerateColumns="False" EmptyDataText="No Data Found" OnRowDataBound="GrdEmplistFromAtt_RowDataBound"
                                                                                HeaderStyle-ForeColor="#990000">
                                                                                <Columns>
                                                                                    <asp:TemplateField HeaderText=" " HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center"
                                                                                        ItemStyle-Width="25px">
                                                                                        <HeaderTemplate>
                                                                                            <asp:CheckBox ID="chkAll" runat="server" AutoPostBack="true" OnCheckedChanged="chkAll_CheckedChanged" />
                                                                                        </HeaderTemplate>
                                                                                        <ItemTemplate>
                                                                                            <asp:CheckBox ID="chkSingle" runat="server" />
                                                                                        </ItemTemplate>
                                                                                        <HeaderStyle HorizontalAlign="Center"></HeaderStyle>
                                                                                        <ItemStyle HorizontalAlign="Center" Width="10px"></ItemStyle>
                                                                                    </asp:TemplateField>
 </Columns>
                                                                                <HeaderStyle HorizontalAlign="Justify" VerticalAlign="Top"
                                                                                    Font-Bold="true" />
                                                                                <RowStyle Font-Size="Small" Height="1" Font-Italic="true" />
                                                                            </asp:GridView>






protected void chkAll_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox chk_All = (CheckBox)GrdAtt.HeaderRow.FindControl("chkAll");
            if (chk_All.Checked == true)
            {
                foreach (GridViewRow gvr in GrdEmplistFromAtt.Rows)
                {
                    CheckBox chk_Single = (CheckBox)gvr.FindControl("chkSingle");
    
                    if (chk_Single.Visible == true)
                    {
                        chk_Single.Checked = true;
                        lblSelectedRecord.InnerText = (Convert.ToInt32(lblSelectedRecord.InnerText) + 1).ToString();
                    }
                }
            }
            else
            {
                foreach (GridViewRow gvr in GrdEmplistFromAtt.Rows)
                {
                    CheckBox chk_Single = (CheckBox)gvr.FindControl("chkSingle");
                    chk_Single.Checked = false;
                    lblSelectedRecord.InnerText = "0";
                }
            }
        }

Upvotes: 0

Karl Anderson
Karl Anderson

Reputation: 34846

Your first problem is that you are searching for the chkEmp check box, but it does not exist in the header row, because foreach (GridViewRow row in Grd.Rows) will loop through all rows in the grid (including header, data and footer rows).

The ItemTemplate in your grid view markup applies to rows of type DataRow, so you need to restrict your searching for chkEmp to just data rows, like this:

protected void chkboxSelectAll_CheckedChanged(object sender, EventArgs e)
{
    CheckBox ChkBoxHeader = (CheckBox)Grd.HeaderRow.FindControl("chkboxSelectAll");

    foreach (GridViewRow row in Grd.Rows)
    {
        // Only look in data rows, ignore header and footer rows
        if (row.RowType == DataControlRowType.DataRow)
        {
            CheckBox ChkBoxRows = (CheckBox)row.FindControl("chkEmp");

            if (ChkBoxHeader.Checked == true)
            {
                ChkBoxRows.Checked = true;

                var id = Grd.DataKeys[row.RowIndex].Value;
                SqlConnection con = new SqlConnection(constr);
                string qry = "delete from empdetail where id=@id";
                SqlCommand cmd = new SqlCommand(qry, con);
                cmd.Parameters.AddWithValue("@id", id);
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
                bindgrid();
            }
            else
            {
                ChkBoxRows.Checked = false;
            }
        }
    }
}

Upvotes: 2

Related Questions