【问题标题】:gridview linkbutton CommandArgument value not changinggridview linkbutton CommandArgument 值不变
【发布时间】:2015-01-15 10:08:05
【问题描述】:

我有一个带有数据列表的网格视图和一个用于删除行的 LinkBut​​ton。

<asp:GridView ID="gridApartment" EmptyDataText="No Records Found" runat="server" AutoGenerateColumns="False" BorderWidth="0"
                            AllowPaging="true" ShowFooter="false" PageSize="15" Width="100%" OnPageIndexChanging="gridApartment_PageIndexChanging"
                            CssClass="mGrid"
                            OnRowDeleting="gridApartment_RowDeleting" OnRowCommand="gridApartment_RowCommand">
                            <AlternatingRowStyle CssClass="alt" />
                            <PagerStyle CssClass="pgr" />
                            <Columns>
                                <asp:TemplateField HeaderText="Building">
                                    <ItemTemplate>
                                        <asp:Label ID="BuildingName" runat="server" Text='<%#Eval("BuildingName") %>'></asp:Label>
                                    </ItemTemplate>
                                    <HeaderStyle Width="25%"></HeaderStyle>
                                </asp:TemplateField>


                                <asp:TemplateField>
                                    <ItemTemplate>
                                        <asp:LinkButton ID="lnkDelete" CssClass="aDelete" ToolTip="Delete" runat="server" CommandName="delete" OnClientClick=' javascript:return confirm("Are you sure you want to delete?"); '
                                            CommandArgument='<%# Eval("RoomDetailsId") %>'>Delete</asp:LinkButton>
                                    </ItemTemplate>
                                    <HeaderStyle Width="8%"></HeaderStyle>
                                </asp:TemplateField>

                            </Columns>

                        </asp:GridView>

加载此代码填充的数据

gridApartment.DataSource = masterManager.GetAllRooms();
gridApartment.DataBind();

现在我有一个搜索框,当我搜索时,过滤器结果将被此代码绑定。

gridApartment.DataSource = conobj.GetSearchDetails("usp_RoomDetailsSearch", "@SearchName", txtSearchterm.Text.Trim());
gridApartment.DataBind();

对于删除代码是

protected void gridApartment_RowCommand(object sender, System.Web.UI.WebControls.GridViewCommandEventArgs e)
    {
        if (e.CommandName == "delete")
        {
            var masterManager = new MasterEntryManager();

            int res = masterManager.DeletRoom(e.CommandArgument.ToString());

            Search();
        }
    }

当第一次加载网格时,e.CommandArgument 具有正确的 ID,我可以删除正确的行。但是当我搜索并重新绑定 gridview 时,e.CommandArgument 值不会用新 ID 更新。它仍然返回在页面加载时首先加载的相同 ID。

例如:

  1. 首次加载网格时,当我尝试删除第一行时,e.CommandArgument 的 ID 为 1001,我删除了 ID 为 1001 的记录。
  2. 现在我第二次加载gridview。现在第一行链接按钮 e.CommandArgument 的 ID 为 1500。
  3. 我执行搜索,结果网格只有 5 行
  4. 现在我尝试删除第一行,预期的链接按钮 e.CommandArgument ID 为 2001,但我得到的链接按钮 e.CommandArgument ID 为 1500,即首次加载 gridview 时第一行 ID 的值

ID 未更新。 如何获取更新后的 e.CommandArgument 值。?

【问题讨论】:

  • 当您使用LinkButton 时,请尝试使用OnClick 事件而不是CommandName,在OnClick 事件中尝试此(sender as LinkButton).CommandArgument
  • 我编写了 OnClick 事件。但是在搜索并重新填充 gridview 后,ID 值没有得到更新。
  • 然后检查您是否通过视图源或调试器窗口在CommandArument 中获得正确的ID。
  • 没有。我在 CommandArument 中没有得到正确的 ID。搜索后 CommandArument 的值未得到更新。该值与第一次加载网格时分配的值相同。
  • 您可能是从您的DataSource 获得的,您可能需要检查您从DataBase 返回的数据(从向 GridView 提供数据的方法)

标签: c# asp.net


【解决方案1】:

出乎意料的是,CommandArgument 与执行回发的控件没有关联。相反,DataSource 作为 ViewState 的一部分返回,CommandArgument 由控件的索引引用。如果 GridView 或 DataSource 发生变化,则索引将不再正确。

您需要确保 GridView 和 DataSource 在引用 CommandArgument 之前没有更新,而是在删除之后更新(看起来您有这部分)。请记住,回发事件发生在页面加载之后。

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        gridApartment.DataSource = masterManager.GetAllRooms();
        gridApartment.DataBind();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2010-09-28
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多