ASP.NET GridView delete confirmation using asp:CommandField
ASP.NET GridView delete confirmation using asp:CommandField with LINQ to SQL.
Introduction
There are a few articles out there that already that deals with how to get a JavaScript delete confirmation up in a GridView
, I know..., but none of them were exactly what I was after. My method can be used when Updates and Deletes are automatically handled by an asp:LinqDataSource
control. You will need your own LINQ DataContext
class for your database, and I guess the same principle can be applied to other data source classes too.
Implementation
First, you will need a GridView
control that gets its data from a LinqDataSource
. Make sure you specify the OnRowDataBound
attribute and use the LinqDataSource
with delete enabled.
<asp:GridView ID="GridView1" runat="server" PageSize="10" AllowPaging="True"
AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="RecordID"
DataSourceID="MyDataSource" OnRowDataBound="GridView_RowDataBound">
<Columns>
<asp:BoundField DataField="Code" HeaderText="Code" SortExpression="Code"
ItemStyle-Width="100px" />
<asp:BoundField DataField="Description" HeaderText="Description"
SortExpression="Description" ItemStyle-Width="560px"
ControlStyle-Width="560px" />
<asp:CommandField HeaderImageUrl="..\Images\DeleteImg.png" ShowDeleteButton="True"
DeleteImageUrl="..\Images\DeleteImg.png" DeleteText="Delete Record"
ItemStyle-Font-Size="8pt" ItemStyle-Width="30px" ButtonType="Image">
</asp:CommandField>
</Columns>
</asp:GridView>
<asp:LinqDataSource ID="MyDataSource" runat="server"
ContextTypeName="MyNameSpace.MyDbDataContext"
EnableUpdate="true" EnableDelete="true" TableName="MyTable">
</asp:LinqDataSource>
Except for the OnRowDataBound
, this control should now work with delete functionality without writing a single line of code.
The next step is to implement the GridView_RowDataBound
function which looks like this:
protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
// loop all data rows
foreach (DataControlFieldCell cell in e.Row.Cells)
{
// check all cells in one row
foreach (Control control in cell.Controls)
{
// Must use LinkButton here instead of ImageButton
// if you are having Links (not images) as the command button.
ImageButton button = control as ImageButton;
if (button != null && button.CommandName == "Delete")
// Add delete confirmation
button.OnClientClick = "if (!confirm('Are you sure " +
"you want to delete this record?')) return;";
}
}
}
}
The important bit here is to use exactly the OnClientClick
content provided (except the wording in the message, of course). If you, for example, instead, had "return confirm('Are you sure you want to delete the record')"
like many others have suggested, this would mean the Delete command would never be posted back to the server. The actual onclick
function call generated/rendered by ASP.NET - if you follow the code supplied above - will be something like this...
onclick="if (!confirm('Are you sure you want to delete this record?')) return;
javascript:__doPostBack('ctl00$cphMain$GridView1','Delete$9')"
You can see that the JavaScript you provide is appended with the postback call from ASP.NET. If you return in your JavaScript prematurely, the postback will never be triggered.
Note: I used images for my command buttons in my GridView
. Remember to cast to the LinkButton
class instead of the ImageButton
class if you use text-links for command buttons.