Search code examples
c#asp.netgridviewdatatableviewstate

Delete Row From asp GridView and From Datatable


I have asp gridview which is bind with a datatable. Only one template column that is checkbox is bind with source datatable column (sel).

Here is markup example:

<asp:GridView  ID="testGrid"  
                CssClass="ObjSelection" 
                AutoGenerateColumns="false" 
                OnRowDataBound="testGrid_RowDataBound"
                runat="server">
 <Columns>
     <asp:TemplateField HeaderText="&nbsp">
        <HeaderTemplate>
           <asp:CheckBox ID="chkAll" runat="server" Enabled="true" AutoPostBack="true" />
        </HeaderTemplate>
        <ItemTemplate>
            <asp:CheckBox AutoPostBack="true" ID="chkRow" runat="server" Checked='<%# DataBinder.Eval(Container.DataItem, "sel")%>' OnCheckedChanged="ChkRow_OnCheckChange" />
        </ItemTemplate>
     </asp:TemplateField>                                   

 </Columns>
</asp:GridView>

As you see, I am not using RowCommand to delete a row. I have a toolbar in a separate div, which shows delete button.

Can you guide how could I delete a row both from DataSource and GridView on a button click which exists in another div?


Solution

  • Use below code to remove selected row from datatable which is either in ViewState or in Session and assign data source

    Aslo assign datakey to GridView

    <asp:GridView  ID="testGrid"    DataKeyNames="PrimaryKey" 
                    CssClass="ObjSelection" 
                    AutoGenerateColumns="false" 
                    OnRowDataBound="testGrid_RowDataBound"
                    runat="server">
    

    Code Behind:

    protected void btnRemove(object sender, EventArgs e)
        {
            // Check session exists 
            if (Session["Key"] != null)
            {
                // Opening / Retreiving DataTable.
                DataTable dt = (DataTable)Session["Key"];
    
                foreach (GridViewRow row in testGrid.Rows)
                {
                    CheckBox chkRow= row.Cells[0].FindControl("chkRow") as CheckBox;
    
                    if (chkRow!= null && chkRow.Checked)
                    {                    
                        int Id = Convert.ToInt32(testGrid.DataKeys[row.RowIndex].Value); 
    
                        DataRow[] drs = dt.Select("PrimaryKey = '" + Id + "'"); // replace with your criteria as appropriate
    
                        if (drs.Length > 0)
                        {
                            dt .Rows.Remove(drs[0]);
                        }
                    }
                }
    
                Session["Key"] = dt ;
                testGrid.DataSource = dt ;
                testGrid.DataBind();
            }
        }