【问题标题】:GridView sorting with ImageButtons and Delete Command not working使用 ImageButtons 和删除命令的 GridView 排序不起作用
【发布时间】:2014-04-03 19:26:46
【问题描述】:

我有一个 GridView 控件,它有 5 个已启用排序的绑定字段和 4 个模板字段。模板字段之一是删除图像按钮,单击该按钮可删除该行。现在,当用户按原样使用 gridview 时,一切都很好,没有排序。但是当他们对其进行排序然后按删除时,命令参数接收到错误的行信息并将其删除,而不是删除他们选择删除的内容。这只发生在具有图像按钮控件的 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>

EDIT-数据源代码

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
    SelectMethod="GetAllEntities" 
    TypeName="DataAccessLayer.Repository.BillingEntityRepository">
    <SelectParameters>
        <asp:QueryStringParameter DefaultValue="-1" Name="clientId" 
            QueryStringField="clientId" Type="Int32" />
        <asp:Parameter DefaultValue="Name" Name="sortColumn" Type="String" />
        <asp:Parameter DefaultValue="ASC" Name="sortOrder" Type="String" />
    </SelectParameters>
</asp:ObjectDataSource>

而我的GridView排序方法如下:

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

用户看到的编辑行

【问题讨论】:

  • 在您的 _Sorting 事件中,您将 Gridview 绑定到什么?我看不到正在设置的数据源。
  • @MartinSmellworse:我已经编辑了我的帖子以包含数据源。
  • 你说“他们选择删除什么”?他们如何选择一行?有没有选择按钮或其他方式?
  • 如果在同一单元格的标签中显示执行删除操作的 ImageButton 的命令参数,会发生什么情况?排序时它是否保持正确的值?我从未见过像您那样绑定的 GridView。我总是使用 DataSet - 如果它不是太大,则将其保留在 ViewState 中,并在每次排序数据绑定之前更改 DataSet 的 SortOrder。
  • 听起来你可能会绑定网格两次。每次回发一次,排序一次。如果您的删除发生在这两个数据绑定之间,它将解释为什么它会选择“最后一个”ID。编辑。我看到其他人已经提出了同样的建议。

标签: c# asp.net gridview


【解决方案1】:

单击删除按钮时,页面加载发生在您的删除处理程序代码之前。所以如果你在page_load事件中绑定GridView,你应该在!IsPostBack条件下绑定:

if (!IsPostBack)
{
    GridView1.DataSource = MyDataSource;
    GridView1.DataBind();
}

因为如果每次都绑定GridView,数据会重新加载,即GridView会重新填充未排序的数据,从而丢失之前的排序顺序。

【讨论】:

    猜你喜欢
    • 2010-09-06
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 2017-07-29
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多