【问题标题】:GridView Sorting QuestionGridView 排序问题
【发布时间】:2011-07-06 19:44:57
【问题描述】:

我有一个现有的网格视图,我需要在工作中修复/改进它。基本上,GridView 有标题,它们被后面代码中的数据集绑定,它使用 BoundFields 和 TemplateFields。问题是我需要让每一列都可以排序。由于它不是标准的gridview,最好的方法是什么?,我需要制作标题链接,然后单击以按DESC或ASC顺序排序。这是我需要处理的 gridview 示例。

<asp:GridView ID="theGrid" runat="server" CssClass="Grid" AllowPaging="True" AutoGenerateColumns="False" CellPadding="4" ForeColor="#FFFFFF" GridLines="None" OnPageIndexChanging="theGrid_PageIndexChanging" CaptionAlign="Left" OnRowCommand="theGrid_RowCommand" Width="100%" PageSize="25" AllowSorting="True" EmptyDataText="It's Empty.">
    <Columns>
        <asp:BoundField DataField="TestID" HeaderText="ID"/>
        <asp:TemplateField HeaderText="Name">
            <ItemTemplate>
                <a href='sometest.aspx?ID=<%# DataBinder.Eval(Container.DataItem, "TestID").ToString()%>'><%# DataBinder.Eval(Container.DataItem, "Type").ToString()%></a>
            </ItemTemplate> 
        </asp:TemplateField>    
          <asp:TemplateField HeaderText="Address">
            <ItemTemplate>
                <div align="right"><%# (DataBinder.Eval(Container.DataItem, "HouseNumber"))%></div>
            </ItemTemplate> 
        </asp:TemplateField>  

...等等,对 BoundFields 和 TemplateFields 进行排序的最佳方法是什么?

【问题讨论】:

  • 例如如何按 ID 排序?给定上面的例子并启用链接?,现在它只显示标题“不可点击”

标签: c# asp.net


【解决方案1】:

您需要设置SortExpression

<asp:TemplateField HeaderText="Name" SortExpression="Name">
    <ItemTemplate>
        <a href='sometest.aspx?ID=<%# DataBinder.Eval(Container.DataItem, "TestID").ToString()%>'><%# DataBinder.Eval(Container.DataItem, "Type").ToString()%></a>
    </ItemTemplate> 
</asp:TemplateField>    
<asp:TemplateField HeaderText="Address" SortExpression="Address">
    <ItemTemplate>
                <div align="right"><%# (DataBinder.Eval(Container.DataItem, "HouseNumber"))%></div>
    </ItemTemplate> 
</asp:TemplateField>            

在代码隐藏中,您可以将当前的 SortExpression 和 SortDirection 存储在 ViewState 中:

Private Property SortExpression() As String
    Get
        If ViewState("SortExpression") Is Nothing OrElse ViewState("SortExpression").ToString().Length = 0  Then
            ViewState("SortExpression") = "Name ASC"
        End If
        Return ViewState("SortExpression").ToString
    End Get
    Set(ByVal value As String)
        ViewState("SortExpression") = value
    End Set
End Property

在 GridView 的 Sorting-Handler 中:

Protected Sub theGrid_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles theGrid.Sorting
    Dim currentSortColumn, currentSortDirection As String
    currentSortColumn = Me.SortExpression.Split(" "c)(0)
    currentSortDirection = Me.SortExpression.Split(" "c)(1)

    If e.SortExpression.Equals(currentSortColumn) Then
        'switch sort direction
        Select Case currentSortDirection.ToUpper
            Case "ASC"
                Me.SortExpression = currentSortColumn & " DESC"
            Case "DESC"
                Me.SortExpression = currentSortColumn & " ASC"
        End Select
    Else
        Me.SortExpression = e.SortExpression & " ASC"
    End If

    BindGrid() 'load the data with this SortExpression and DataBind the Grid'
End Sub

对不起 VB.NET,我注意到为时已晚。你可以翻译它here

编辑:C#

private string SortExpression {
    get {
        if (ViewState("SortExpression") == null || ViewState("SortExpression").ToString().Length == 0) {
            ViewState("SortExpression") = "Name ASC";
        }
        return ViewState("SortExpression").ToString;
    }
    set { ViewState("SortExpression") = value; }
}



protected void theGrid_Sorting(object sender, System.Web.UI.WebControls.GridViewSortEventArgs e)
{
    string currentSortColumn = null;
    string currentSortDirection = null;
    currentSortColumn = this.SortExpression.Split(' ')[0];
    currentSortDirection = this.SortExpression.Split(' ')[1];

    if (e.SortExpression.Equals(currentSortColumn)) {
        //switch sort direction
        switch (currentSortDirection.ToUpper()) {
            case "ASC":
                this.SortExpression = currentSortColumn + " DESC";
                break;
            case "DESC":
                this.SortExpression = currentSortColumn + " ASC";
                break;
        }
    } else {
        this.SortExpression = e.SortExpression + " ASC";
    }

    //load the data with this SortExpression and DataBind the Grid
    BindGrid();
}

【讨论】:

  • 是的,VB 对我来说就像中文:)。我将实施并回来:)。 (同时给你投票:))
  • @user:我改变了一点。我在旧代码中使用了一个辅助函数GetString(ViewState("SortExpression"),这个示例中没有。现在它应该编译了;)
  • 你好 只是一个小问题,我有方法来做 BindGrid();我需要用 SortExpression 加载数据吗?或者我只是调用 BindGrid() 并且它应该处理它?
  • @user:这取决于您加载数据的方式和位置。但简单来说,属性SortExpression 是您的SELECTORDER BY。顺便说一句,BindGrid 不是一个 .NET 函数,而是您在其中加载 GridView 的数据源并调用 theGrid.DataSource = yourDataSourcetheGrid.DataBind 的函数。
  • 知道了,最后一个问题,如果我有这样的 BoundField数据字段?
猜你喜欢
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多