C# 使用ImageButtons和Delete命令的GridView排序不起作用

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

我有一个GridView控件,它有5个绑定字段(启用排序)和4个模板字段。模板字段之一是“删除图像”按钮,单击该按钮可删除行。现在,当用户只使用gridview时,一切都很好,没有排序。但当他们对其排序并按delete键时,命令参数接收到错误的行信息并将其删除,而不是删除他们选择删除的行。这仅在具有图像按钮控件的2个模板字段中发生

<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();
}