【问题标题】:Deleting Row from Gridview with SelectedIndexChanged使用 SelectedIndexChanged 从 Gridview 中删除行
【发布时间】:2015-04-13 14:18:43
【问题描述】:

我有一个 gridview,它实现了 SelectedIndexChanged 事件。现在,我添加了一个带有LinkButton 的模板字段来删除该行。但是,我无法单击GridView 上的链接按钮,因为它总是触发SelectedIndexChanged

SelectedIndexChanged 功能实现时,如何使删除按钮起作用。

     <asp:GridView ID="gvOnboardingMembers" runat="server" AllowPaging="True" PageSize="30" AllowSorting="True" OnPageIndexChanging="gvOnboardingMembers_PageIndexChanging" OnRowDataBound="gvOnboardingMembers_RowDataBound"  OnRowDeleting="gvOnboardingMembers_RowDeleting"
                        AutoGenerateColumns="False" OnSorting="gvOnboardingMembers_Sorting" EnableViewState="False" BackColor="White" BorderColor="#cccccc" BorderWidth="1px" CellPadding="2"
                        EmptyDataText="No onboarding member found" GridLines="None" OnSelectedIndexChanged="gvOnboardingMembers_SelectedIndexChanged" Width="100%">
                        <AlternatingRowStyle BackColor="#ededed" />
                        <Columns>
                            <asp:TemplateField HeaderText="OnboardingMemberID" Visible="false">
                                <ItemTemplate>
                                    <asp:Label ID="lblOnboardingMemberID" runat="server" Text='<%#Eval("OnboardingMemberID") %>' />
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:BoundField DataField="FirstName" HeaderText="First Name" SortExpression="FirstName" HeaderStyle-HorizontalAlign="Left" />
                            <asp:BoundField DataField="LastName" HeaderText="Last Name" SortExpression="LastName" HeaderStyle-HorizontalAlign="Left"/>
                            <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" HeaderStyle-HorizontalAlign="Left"/>
                            <asp:BoundField DataField="VendorName" HeaderText="Vendor" SortExpression="VendorName" HeaderStyle-HorizontalAlign="Left"/>
                            <asp:BoundField DataField="BusinessFunctionDisplayName" HeaderText="Business Function" SortExpression="BusinessFunctionDisplayName" HeaderStyle-HorizontalAlign="Left"/>
                            <asp:BoundField DataField="CreatedDate" HeaderText="Upload Timestamp" SortExpression="CreatedDate" HeaderStyle-HorizontalAlign="Left"/>
                            <asp:TemplateField HeaderText="">
                                <ItemTemplate>
                                    <asp:LinkButton ID="lnkRemoveEntry" runat="server" OnClick="lnkRemoveEntry_Click" Text="Delete" />
                                </ItemTemplate>
                            </asp:TemplateField>
<asp:CommandField ItemStyle-Width="20" ShowDeleteButton="True" />
                        </Columns>
                        <FooterStyle BackColor="#cccccc" ForeColor="Black" />
                        <HeaderStyle BackColor="#6699cc" Font-Bold="True" ForeColor="White" BorderColor="#cccccc" BorderWidth="1px" />
                        <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
                        <RowStyle BackColor="#fefefe" ForeColor="Black" />
                        <SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" />
                        <SortedAscendingCellStyle BackColor="#F1F1F1" />
                        <SortedAscendingHeaderStyle BackColor="#0000A9" />
                        <SortedDescendingCellStyle BackColor="#CAC9C9" />
                        <SortedDescendingHeaderStyle BackColor="#000065" />
                    </asp:GridView>

后端代码

protected void gvOnboardingMembers_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Attributes["onmouseover"] = "this.style.cursor='pointer';this.style.textDecoration='underline';";
            e.Row.Attributes["onmouseout"] = "this.style.textDecoration='none';";
            e.Row.Attributes["onclick"] = Page.ClientScript.GetPostBackClientHyperlink(gvOnboardingMembers, "Select$" + e.Row.RowIndex);
            e.Row.ToolTip = "Click to select this row.";

            DataRowView dataItem = (DataRowView)e.Row.DataItem;

            var removeEntry = e.Row.FindControl("lnkRemoveEntry") as LinkButton;
            removeEntry.CommandArgument = dataItem["OnboardingMemberID"].ToString();
        }
    }

protected void gvOnboardingMembers_SelectedIndexChanged(object sender, EventArgs e)
        {
            foreach (GridViewRow row in gvOnboardingMembers.Rows)
            {
                if (row.RowIndex == gvOnboardingMembers.SelectedIndex)
                {
                    row.BackColor = ColorTranslator.FromHtml("#A1DCF2");
                    row.ToolTip = string.Empty;
                }
                else
                {
                    row.BackColor = ColorTranslator.FromHtml("#FFFFFF");
                    row.ToolTip = "Click to select this row.";
                }
            }
}

protected void Page_Load(object sender, EventArgs e)
        {
            BindOnboardingMember();
        }

        private void BindOnboardingMember()
        {
            DataView dv = new DataView(DataManager.ToDataTable<OnboardingMember>(DraftMembers));
            dv.Sort = OnboardingMemberSortExpression;

            gvOnboardingMembers.DataSource = dv;
            gvOnboardingMembers.DataBind();
        }
protected void lnkRemoveEntry_Click(object sender, EventArgs e)
        {
            var lnkButton = (LinkButton)sender;

        }

protected void gvOnboardingMembers_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            if(DeleteOnboardingMember(Guid.Parse(((Label)(gvOnboardingMembers.Rows[e.RowIndex].Cells[0].FindControl("lblOnboardingMemberID"))).Text)))
                BindOnboardingMember();
        }

如果在 selectedIndexChanged 上有任何阻止 PostBack 的方法,请告诉我。我猜我的删除事件没有执行,因为每次回发页面时我的 gridview 都会反弹(请参阅 pageload 事件)。但是,为了使 SelectedIndexChanged 正常工作,这是必需的。

【问题讨论】:

  • 如果你想删除行,最好使用onRowDeleting,检查每一行的ID
  • 我也实现了 RowDeleting。它既不属于 RowDeleting 也不属于 Button Click。
  • 你如何绑定你的gridview,它应该在IsPostBack 内,正如安格斯建议的那样。
  • 我不能使用 IsPostBack,因为它会阻止 SelectedIndexChanged。我陷入了困境!请参考我对该错误建议的回复。

标签: c# asp.net gridview


【解决方案1】:

我无法阻止这种情况,但我实施了一种解决方法,即在删除单击时使用 WebMethods 而不是常规的 RowDeleting 事件。

protected void gvOnboardingMembers_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Attributes["onmouseover"] = "this.style.cursor='pointer';this.style.textDecoration='underline';";
            e.Row.Attributes["onmouseout"] = "this.style.textDecoration='none';";
            e.Row.Attributes["onclick"] = Page.ClientScript.GetPostBackClientHyperlink(gvOnboardingMembers, "Select$" + e.Row.RowIndex);
            e.Row.ToolTip = "Click to select this row.";

            DataRowView dataItem = (DataRowView)e.Row.DataItem;

            if ((e.Row.RowState & DataControlRowState.Edit) == 0)
            {
                LinkButton deleteButton = (LinkButton)e.Row.Cells[7].Controls[0];
                if (deleteButton != null)
                    deleteButton.Attributes.Add("onclick", "return deleteOnboardingMember('" + dataItem["OnboardingMemberID"].ToString() + "');");
            }
        }
    }
[WebMethod(EnableSession=true)]
    public static void DeleteOnboardingMember(string onboardingMemberID)
    {
        if(new processingClass().DeleteOnboardingMember(Guid.Parse(onboardingMemberID)))
            HttpContext.Current.Session["DraftMembers"] = null;
    }

脚本

    <script type="text/javascript">
    function deleteOnboardingMember(id) {
        if (confirm("Are you sure you want to remove this entry?"))
        {
            $.ajax({
                type: "POST",
                url: "/OnboardingRequest.aspx/DeleteOnboardingMember",
                async: false,
                contentType: "application/json; charset=utf-8",
                data: "{ 'onboardingMemberID': '" + id + "'}",
                dataType: "json",
                success: function () {
                    window.location.reload();
                },
                error: function (xhr, status, error) {
                    var err = eval("(" + xhr.error + ")");
                    alert(err.Message);
                },
                failure: function () {
                    alert('failure');
                }
            });
        }

        return false;
    }
</script>

【讨论】:

    【解决方案2】:

    试试这个方法。

    protected void Page_Load(object sender, EventArgs e)
    {
         if (!IsPostBack)
         {
             BindOnboardingMember();
         }
    }
    

    【讨论】:

    • 我也试过了。由于我有 SelectedIndexChanged 事件,因此不需要检查 IsPostBack。如果我验证我永远不会得到“gvOnboardingMembers.SelectedRow”。它总是会返回一个异常“索引超出范围。必须是非负数并且小于集合的大小。参数名称:索引。”
    • 你能在你的项目和数据库中放一个下载链接吗?
    • 我不能这样做,因为它太大了。到目前为止,我试图粘贴实际代码。请参考我发布的解决方法作为答案。
    • 请参考我发布的答案。我已经通过解决方法解决了。但它满足我的要求。
    • 好的,我明白了。 WebMethod是删除数据的好方法。
    【解决方案3】:

    鉴于您的 Gridview 定义(我已排除化妆品):

    <asp:GridView ID="gvOnboardingMembers" runat="server" 
        AllowPaging="True"
        PageSize="30" 
        AllowSorting="True"
        OnPageIndexChanging="gvOnboardingMembers_PageIndexChanging"
        OnRowDataBound="gvOnboardingMembers_RowDataBound" 
        OnRowDeleting="gvOnboardingMembers_RowDeleting"
        OnSorting="gvOnboardingMembers_Sorting" 
        EnableViewState="False" 
        EmptyDataText="No onboarding member found" 
        OnSelectedIndexChanged="gvOnboardingMembers_SelectedIndexChanged">
    

    您对如何在 Gridivew 中触发事件有一个基本的误解。您不能简单地添加一个名为“Delete”的 LinkBut​​ton 并提供这样的事件处理程序:

    <asp:LinkButton ID="lnkRemoveEntry" runat="server" 
        OnClick="lnkRemoveEntry_Click" 
        Text="Delete" />
    

    并期望触发 GridView RowDeleting 事件。您需要在 Button 中提供 CommandName。对于删除操作,您需要将CommandName="Delete" 添加到链接按钮。 See this for more on handling GridView operations

    GridView 还可以识别其他几个 CommandName 值:“Insert”、“Edit”、“Update”、“Cancel”。每个触发它自己适当的 Gridview 行特定事件,并且 ALL 触发 RowCommand 事件。

    当您不指定数据源时,您必须手动连接所有编辑命令事件,这包括确保您获取正确的 PK 来处理删除和更新操作。

    【讨论】:

    • 我已经知道了;我在很多地方都实现了这一点。我引用了其他人,我也测试了那个,但那没有用。我没想到 LinkBut​​ton 会触发 RowDeleting。
    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 2016-05-25
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2012-12-18
    相关资源
    最近更新 更多