Telerik makes this easy because any control inside a GridTemplateColumn can have client-side attributes added directly in the markup.
Below is the simplest and most reliable pattern.
ASPX Markup (TemplateColumn with Confirm)
<telerik:GridTemplateColumn HeaderText="Delete">
<ItemTemplate>
<asp:Button ID="btnDelete" runat="server" Text="Delete" CommandName="DeleteItem" OnClientClick="return confirm('Are you sure you want to delete this item?');" />
</ItemTemplate>
</telerik:GridTemplateColumn>
What this does
If you’re using a LinkButton instead
<asp:LinkButton ID="lnkDelete" runat="server" Text="Delete" CommandName="DeleteItem" OnClientClick="return confirm('Delete this record?');" />
If you need to inject the confirm dynamically (e.g., in ItemDataBound)
This is useful when the message depends on row data.
VB.NET Code-behind
Protected Sub RadGrid1_ItemDataBound(sender As Object, e As Telerik.Web.UI.GridItemEventArgs) Handles RadGrid1.ItemDataBound
If TypeOf e.Item Is GridDataItem Then Dim dataItem As GridDataItem = CType(e.Item, GridDataItem)
Dim btn As Button = CType(dataItem.FindControl("btnDelete"), Button)
if btn IsNot Nothing Then
btn.Attributes("onclick") = "return confirm('Are you sure you want to delete this record?');"
End If
End If
End Sub