gridview linkbutton CommandArgument值不变

时间:2015-01-15 10:08:05

标签: c# asp.net

我有一个带有数据列表的网格视图和一个用于删除该行的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>

由此代码填充的onload数据

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。现在第1行linkbutton e.CommandArgument的ID为1500。
  3. 我执行搜索,结果网格只有5行
  4. 现在我尝试删除第一行,预期的链接按钮e.CommandArgument ID是2001,但是我得到了linkbutton e.CommandArgument ID为1500,gridview首次加载时第一行ID的值
  5. 我的ID未获更新。 如何获取更新的e.CommandArgument值。

1 个答案:

答案 0 :(得分:0)

与预期相反,CommandArgument与执行回发的控件没有关联。而是,DataSource作为ViewState的一部分返回,并且CommandArgument由控件的索引引用。如果GridView或DataSource发生更改,则索引将不再正确。

您需要确保在引用CommandArgument之前没有更新GridView和DataSource,但是在删除之后再更新(看起来就像您拥有此部分一样)。请记住,回发事件是在页面加载之后发生的。

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