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=" ">
<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
?
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();
}
}