我有一个带有数据列表的网格视图和一个用于删除该行的LinkButton。
<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。
例如:
我的ID未获更新。 如何获取更新的e.CommandArgument值。
答案 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();
}
}