Search code examples
asp.netgridviewrowdeleting

Gridview Delete Linkbutton not firing RowDeleting Event


I am so frustrated. Using asp.net GridView. Using a LinkButton with the CommandName="Delete". Don't understand why the page isn't posting back. I've done this a million times in other apps. I've compared them against one another and nothing appears different. I will preface by saying this IS someone else's template, however, so it's not my same template.

Any ideas what might be causing my issues?

My scenario is this:

ASPX Page (edited to add the HTML; there's more HTML in the site.Master and there's also a tag for the AjaxControlToolkit at the top of the page):

<div class="width80 container body-content">
    <h2 class="marginTop50">Message Board</h2>
    <asp:Panel ID="pnlMsgsForUser" runat="server" Visible="false">
        <div class="jumbotronSmallFont">
            <asp:Label ID="lblErrorMessage" CssClass="has-error" runat="server"></asp:Label>
        </div>
    </asp:Panel>

    <div class="jumbotronSmallFont">
        <h4>New Message</h4>
        <form>
            <div class="form-group">
                <label for="messageBody">Message Body</label>
                <textarea class="form-control" id="messageBody" rows="3" style="max-width: 600px;"></textarea>
            </div>
            <div class="text-center">
                <button id="btnSave" class="btn btn-primary" style="width: 75px;">Save</button>
                <button type="button" id="btnReset" class="btn btn-default marginLeft15px" style="width: 75px;">Reset</button>
            </div>
        </form>
    </div>

    <div>
        <asp:GridView ID="gvMessages" runat="server" Width="100%"
            CssClass="table adminMessageBoardTable marginAuto" AutoGenerateColumns="False"
            OnRowUpdating="gvMessages_RowUpdating"
            OnRowCancelingEdit="gvMessages_RowCancelingEdit"
            OnRowDataBound="gvMessages_RowDataBound"
            OnRowEditing="gvMessages_RowEditing"
            OnRowDeleting="gvMessages_RowDeleting"
            DataKeyNames="Id" BorderStyle="NotSet">
            <Columns>
                <asp:TemplateField HeaderText="Message" HeaderStyle-CssClass="center" SortExpression="Message">
                    <EditItemTemplate>
                        <asp:TextBox ID="txtMsg" Width="100%" runat="server"></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label runat="server" Text='<%# Eval("MessageBody") %>' ID="lblMessage"></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Date Updated" SortExpression="DateUpdated" HeaderStyle-CssClass="center" ItemStyle-CssClass="center">
                    <HeaderStyle Width="120px" />
                    <EditItemTemplate>
                        <asp:Label runat="server" ID="lblEditDateUpdated" Enabled="false"></asp:Label>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label runat="server" Text='<%# Eval("DateUpdated","{0:d}") %>' ID="lblDateUpdated"></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Updated By" SortExpression="UpdatedBy" HeaderStyle-CssClass="center" ItemStyle-CssClass="center">
                    <HeaderStyle Width="120px" />
                    <EditItemTemplate>
                        <asp:Label runat="server" Text="" ID="lblEditUpdatedBy" Enabled="false"></asp:Label>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label runat="server" Text='<%# Eval("UpdatedBy") %>' ID="lblUpdatedBy"></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField ItemStyle-CssClass="center">
                    <HeaderStyle Width="120px" />
                    <EditItemTemplate>
                        <asp:LinkButton ID="lbUpdate" runat="server" CausesValidation="True"
                            CommandName="Update" Text="Update"
                            OnClientClick="return confirm('You are about to update this entry.  \n\nDo you wish to proceed?');"></asp:LinkButton>
                        &nbsp;<asp:LinkButton ID="lbCancel" runat="server" CausesValidation="False"
                            CommandName="Cancel" Text="Cancel"></asp:LinkButton>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:LinkButton ID="lbEdit" runat="server" CausesValidation="False"
                            CommandName="Edit" Text="Edit"></asp:LinkButton> &nbsp; &nbsp;
                        <asp:LinkButton ID="lbDelete" runat="server" CommandArgument='<%# Eval("Id") %>' CausesValidation="False" 
                            CommandName="Delete" Text="Delete" OnClientClick="return confirm('You are about to delete this entry. \n\Do you wish to proceed?');"></asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>

            </Columns>
        </asp:GridView>

    </div>

</div>

In my code-behind, I have:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            var user = CommonFunctions.GetUserID(true);
            var Admin = Roles.IsUserInRole(user, "Administrator");
            var Dev = Roles.IsUserInRole(user, "Developer");

            if (!Admin && !Dev)
            {
                Response.Redirect("~/");
            }

            gvBind(true);
        }
    }

When I click on the Delete linkbutton for a row, it drops into the Page_Load and

!Page.IsPostBack 

verifies as true. I have no idea why it's doing this. It also never even hits the RowDeleting command. My breakpoint is so sad.

In my other app, all the markup and code-behind are pretty much the same. The only differences are the gridview name and the Eval tags. But when I click Delete in that app, it skips the !Page.IsPostBack section. :( It also obviously fires the RowDeleting.

I've also tried implementing RowCommand, but that event never fires either. It only does Page_Load and RowDataBound before essentially refreshing the page.

Any ideas?

Please, and thanks!!!


Solution

  • Your code is working fine. When I click Delete button, it triggers gvMessages_RowDeleting event. Here is how I test it -

    <asp:GridView ID="gvMessages" runat="server" Width="100%"
        CssClass="GridView marginAuto" AutoGenerateColumns="False"
        OnRowDeleting="gvMessages_RowDeleting"
        DataKeyNames="Id">
        <Columns>
            <asp:TemplateField HeaderText="Message" HeaderStyle-CssClass="center" SortExpression="Message">
                <ItemTemplate>
                    <asp:Label runat="server" Text='<%# Eval("MessageBody") %>' ID="lblMessage"></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField ItemStyle-CssClass="center">
                <ItemTemplate>
                    <asp:LinkButton ID="lbDelete" runat="server" CommandArgument='<%# Eval("Id") %>' CausesValidation="False"
                        CommandName="Delete" Text="Delete"
                        OnClientClick="confirm('You are about to delete this entry. \n\Do you wish to proceed?');"></asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    

    Code Behind

    public class Item
    {
        public int Id { get; set; }
        public string MessageBody { get; set; }
    }
    
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                gvMessages.DataSource = new List<Item>
                {
                    new Item {Id = 1, MessageBody = "One"},
                    new Item {Id = 2, MessageBody = "Two"},
                    new Item {Id = 3, MessageBody = "Three"},
                };
                gvMessages.DataBind();
            }
        }
    
        protected void gvMessages_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
    
        }
    }