【问题标题】:Gridview Delete Linkbutton not firing RowDeleting EventGridview 删除链接按钮未触发 RowDeleting 事件
【发布时间】:2018-05-11 20:03:14
【问题描述】:

我很沮丧。使用 asp.net GridView。使用带有 CommandName="Delete" 的 LinkBut​​ton。不明白为什么页面不回发。我已经在其他应用程序中这样做了一百万次。我已经将它们相互比较,并没有什么不同。不过,我会先说这是别人的模板,所以它不是我的模板。

任何想法可能导致我的问题?

我的情况是这样的:

ASPX 页面(已编辑以添加 HTML;站点中有更多 HTML。Master 并且页面顶部还有一个 AjaxControlToolkit 标记):

<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>

在我的代码隐藏中,我有:

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);
        }
    }

当我点击一行的删除链接按钮时,它会落入 Page_Load 和

!Page.IsPostBack 

验证为 true。我不知道它为什么这样做。它甚至从未命中 RowDeleting 命令。我的断点好伤心。

在我的另一个应用程序中,所有标记和代码隐藏都几乎相同。唯一的区别是 gridview 名称和 Eval 标签。但是当我在该应用程序中单击删除时,它会跳过 !Page.IsPostBack 部分。 :( 它显然也会触发 RowDeleting。

我也尝试过实现 RowCommand,但该事件也永远不会触发。它只在真正刷新页面之前执行 Page_Load 和 RowDataBound。

有什么想法吗?

拜托了,谢谢!!!

【问题讨论】:

  • 当您点击删除时,服务器端Page_Load() 是只执行一次,还是多次执行?如果不止一次,是IsPostBack ever = true
  • 它只命中一次,@anu start。这似乎不是真的。 :(

标签: asp.net gridview rowdeleting


【解决方案1】:

您的代码运行良好。当我单击删除按钮时,它会触发 gvMessages_RowDeleting 事件。这是我如何测试它 -

<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>

代码隐藏

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)
    {

    }
}

【讨论】:

  • 是的,代码应该没问题。它实际上是我另一个项目的模仿者。但是,肯定有其他原因导致它出现奇怪的行为,因为它仍然会逐步执行 if(!IsPostBack) 语句。它从不触发 RowDeleting。也许我需要重新绘制整个页面。我不知道。
  • 这太愚蠢了。我只是重新绘制了页面并重新创建了所有内容,现在它正在工作。 -_- 感谢您的帮助!我不知道为什么 Visual Studio 是一个朋克。
【解决方案2】:
 OnClientClick="return confirm('Are you sure?');"

尝试从您的确认声明中添加退货。

【讨论】:

  • 同样的事情@L0uis。抱歉,我早些时候收到了退货,但是当我尝试所有我读过的关于 lol 的不同事情时,一定是把它删除了。但是,是的,把它放回去并没有改变任何东西。 ://
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多