C# 使用ImageButtons和Delete命令的GridView排序不起作用
我有一个GridView控件,它有5个绑定字段(启用排序)和4个模板字段。模板字段之一是“删除图像”按钮,单击该按钮可删除行。现在,当用户只使用gridview时,一切都很好,没有排序。但当他们对其排序并按delete键时,命令参数接收到错误的行信息并将其删除,而不是删除他们选择删除的行。这仅在具有图像按钮控件的2个模板字段中发生C# 使用ImageButtons和Delete命令的GridView排序不起作用,c#,asp.net,gridview,C#,Asp.net,Gridview,我有一个GridView控件,它有5个绑定字段(启用排序)和4个模板字段。模板字段之一是“删除图像”按钮,单击该按钮可删除行。现在,当用户只使用gridview时,一切都很好,没有排序。但当他们对其排序并按delete键时,命令参数接收到错误的行信息并将其删除,而不是删除他们选择删除的行。这仅在具有图像按钮控件的2个模板字段中发生 <Columns> <asp:BoundField DataField="AccountNo" HeaderText="Accoun
<Columns>
<asp:BoundField DataField="AccountNo" HeaderText="Account No"
SortExpression="AccountNo" />
<asp:BoundField DataField="Address" HeaderText="Address"
SortExpression="Address" />
<asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
<asp:BoundField DataField="Name" HeaderText="Name"
SortExpression="Name" />
<asp:BoundField DataField="State" HeaderText="State" SortExpression="State" />
<asp:BoundField DataField="Zip" HeaderText="Zip" SortExpression="Zip" />
<asp:BoundField DataField="Utility" HeaderText="Utility"
SortExpression="Utility" />
<asp:TemplateField HeaderText="Edit">
<ItemTemplate>
<asp:HyperLink runat="server" ID="EditLink" ToolTip="Edit Account" NavigateUrl='<%# GetEditURL(((BillingEntity)Container.DataItem).Id) %>' >
<img src="../img/edit.png" border="0"/>
</asp:HyperLink>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:TemplateField>
<asp:TemplateField HeaderText="Enable/Disable" >
<ItemTemplate>
<asp:ImageButton runat="server" ID="DisableButton" ImageUrl = "../img/delete.png" ToolTip="Disable Account" CommandName="Disable_Account" CommandArgument='<%#((BillingEntity)Container.DataItem).Id %>' OnClientClick="if (confirm('Are you sure you want to disable this account?')==false) {return false;}" Visible='<%# ShowDisableButton(((BillingEntity)Container.DataItem).Status)%>'/>
<asp:ImageButton runat="server" ID="EnableButton" ImageUrl = "../img/add.png" ToolTip="Enable Account" CommandName="Enable_Account" CommandArgument='<%#((BillingEntity)Container.DataItem).Id %>' Visible='<%# ShowEnableButton(((BillingEntity)Container.DataItem).Status)%>'/>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:TemplateField>
<asp:TemplateField HeaderText="Delete" >
<ItemTemplate>
<asp:ImageButton runat="server" ID="Delete" ImageUrl = "../img/cross.png" ToolTip="Delete Account" CommandName="Delete_Account" CommandArgument='<%#((BillingEntity)Container.DataItem).Id %>' OnClientClick="if (confirm('Invoices associated with this account will be deleted permanently. Are you sure you want to delete this account?')==false) {return false;}" />
</ItemTemplate>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:TemplateField>
<asp:TemplateField HeaderText="View Invoices" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:HyperLink runat="server" ID="ViewInvoiceLink" ToolTip="Recent invoices" NavigateUrl='<%# GetViewInvoiceURL(((BillingEntity)Container.DataItem).Id) %>' >
<img src="../img/go.png" border="0"/>
</asp:HyperLink>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:TemplateField>
<asp:TemplateField HeaderText="Submit Invoice" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:HyperLink runat="server" ID="InvoiceLink" ToolTip="Submit invoice" NavigateUrl='<%# GetSubmitInvoiceURL(((BillingEntity)Container.DataItem).Id) %>' >
<img src="../img/go.png" border="0"/>
</asp:HyperLink>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:TemplateField>
</Columns>
编辑用户看到的行
单击“删除”按钮,页面加载发生在删除处理程序代码之前。因此,如果您在
页面加载
事件中绑定网格视图
,您应该在下绑定!iPostback
条件:
if (!IsPostBack)
{
GridView1.DataSource = MyDataSource;
GridView1.DataBind();
}
因为如果每次绑定
GridView
,数据将重新加载,即GridView
将重新填充未排序的数据,从而丢失以前的排序顺序。在_排序事件中,您将GridView绑定到什么?我看不到正在设置数据源。@更糟糕的是:我已经编辑了我的帖子以包含该数据源。你说的是“他们选择删除的内容”?他们如何选择一排?是否有选择按钮或任何其他方式?如果在同一单元格中的标签中显示执行删除操作的ImageButton的命令参数,会发生什么情况?排序时它是否保持正确的值?我从未见过像您这样绑定GridView。我总是使用数据集-如果数据集不太大,请将其保持在ViewState状态,并在对每个排序进行数据绑定之前更改数据集的排序器。听起来您可能要绑定网格两次。每次回发一次,分类一次。如果您的删除发生在这两个数据绑定之间,它将解释为什么它会选择“最后一个”ID。编辑。我看到其他人已经提出了同样的建议。
protected void GridView_BillingEntity_Sorting(object sender, GridViewSortEventArgs e)
{
if (ObjectDataSource1.SelectParameters.Count == 3)
{
ObjectDataSource1.SelectParameters[1].DefaultValue = e.SortExpression.ToString();
ObjectDataSource1.SelectParameters[2].DefaultValue = GetSortDirection(e.SortExpression);
GridView_BillingEntity.DataBind();
e.Cancel = true;
}
}
if (!IsPostBack)
{
GridView1.DataSource = MyDataSource;
GridView1.DataBind();
}