Стрелка за сортиране нагоре/надолу в Gridview в заглавките на колоните

В момента работя върху някакъв код, който се грижи за сортирането и странирането на данни в изглед на мрежата. Сега се опитвам да внедря стрелка за сортиране (стрелки нагоре/надолу до заглавките на колоните), но нямам успех. Кодът за прилагане на стрелките за сортиране се намира в подпрограмата *GridView1_RowCreated*. Точно сега, когато стартирам кода, изобщо не виждам стрелките за сортиране. Проблемният ред е следният: „If tblAdministrators.SortExpression = lnk.CommandArgument Then“ Не мога да разбера какво не е наред с този ред. Винаги е False, поради което стрелките не се показват.

Private Function GetData(sort As SortDirection) As Data.DataView

    Dim connection As OracleDBConnect = DAL.GetOracleDBConnection()
    Dim request As OracleDBRequest = Nothing
    Dim result As OracleDBResult = Nothing
    Dim trace As OracleDBChronoTrace = Nothing
    Dim status As DBStatus
    Dim sb As New StringBuilder
    Dim dv As DataView

    With sb
        .Append("SELECT * FROM USERS")
    End With

    request = New OracleDBRequest(sb.ToString, CommandType.Text)

    status = connection.Execute(request, result, trace)

    dv = New DataView(result.DataSet.Tables(0))

    If (ViewState("sortExp") IsNot Nothing) Then
        dv = New Data.DataView(result.DataSet.Tables(0))

        If (GridViewSortDirection = SortDirection.Ascending) Then
            GridViewSortDirection = SortDirection.Descending
            dv.Sort = CType(ViewState("sortExp").ToString() & DESCENDING, String)
        Else
            GridViewSortDirection = SortDirection.Ascending
            dv.Sort = CType(ViewState("sortExp").ToString() & ASCENDING, String)
        End If
    Else
        dv = result.DataSet.Tables(0).DefaultView
    End If

    Return dv

End Function


Public Property GridViewSortDirection() As SortDirection
    Get
        If ViewState("sortDir") Is Nothing Then
            ViewState("sortDir") = SortDirection.Ascending
        End If

        Return CType(ViewState("sortDir"), SortDirection)
    End Get

    Set(ByVal value As SortDirection)
        ViewState("sortDir") = value
    End Set

End Property


Protected Sub GridView1_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles tblAdministrators.PageIndexChanging

    tblAdministrators.PageIndex = e.NewPageIndex
    GridViewSortDirection = If(GridViewSortDirection = SortDirection.Descending, SortDirection.Ascending, SortDirection.Descending)
    tblAdministrators.DataSource = GetData(GridViewSortDirection)
    tblAdministrators.DataBind()

End Sub


Protected Sub GridView1_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles tblAdministrators.Sorting

    ViewState("sortExp") = e.SortExpression
    tblAdministrators.DataSource = GetData(GridViewSortDirection)
    tblAdministrators.DataBind()

End Sub

Protected Sub GridView1_RowCreated(sender As Object, e As GridViewRowEventArgs) Handles tblAdministrators.RowCreated
    If e.Row.RowType = DataControlRowType.Header Then
        For Each tc As TableCell In e.Row.Cells
            If tc.HasControls() Then

                Dim lnk As LinkButton = DirectCast(tc.Controls(0), LinkButton)
                If lnk IsNot Nothing Then

                    Dim img As New System.Web.UI.WebControls.Image()

                    img.ImageUrl = "/images/" & (If(GridViewSortDirection = SortDirection.Ascending, "asc", "desc")) & ".gif"

                    If tblAdministrators.SortExpression = lnk.CommandArgument Then

                        tc.Controls.Add(New LiteralControl(" "))
                        tc.Controls.Add(img)

                    End If
                End If
            End If
        Next
    End If
End Sub

ASPX код:

 <asp:GridView ID="tblAdministrators" runat="server" AutoGenerateColumns="false" EmptyDataText="No records found" PageSize="25" AllowPaging="True" AllowSorting="True" OnRowCreated="GridView1_RowCreated">
        <Columns>
            <asp:BoundField HeaderText="Name" DataField="Name" SortExpression="NAME"></asp:BoundField>
        </Columns>
        <Columns>
            <asp:BoundField HeaderText="City" DataField="City" SortExpression="CITY"></asp:BoundField>
        </Columns>
    </asp:GridView>

person Mark Marina    schedule 03.10.2012    source източник


Отговори (2)


Разгледайте моята проба:

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
    AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="CustomerId" 
    DataSourceID="SqlDataSource1">
    <SortedAscendingHeaderStyle CssClass="sortasc" />
    <SortedDescendingHeaderStyle CssClass="sortdesc" />
    <Columns>
        <asp:CommandField ShowSelectButton="True" />
        <asp:BoundField DataField="CustomerId" HeaderText="CustomerId" 
            InsertVisible="False" ReadOnly="True" SortExpression="CustomerId" />
        <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
        <asp:BoundField DataField="IdNumber" HeaderText="IdNumber" 
            SortExpression="IdNumber" />
    </Columns>
</asp:GridView>

Обърнете внимание на SortedAscendingHeaderStyle и SortedDescendingHeaderStyle. Просто създайте подходящи css класове с фоново изображение (стрелка нагоре и стрелка надолу) и сте готови.

person Gregor Primar    schedule 03.10.2012
comment
Грегор. Това ще работи само при използване на SQLDataSource, което не е моят случай. Би било наистина страхотно, ако работи, тъй като е толкова лесно за изпълнение. - person Mark Marina; 03.10.2012
comment
Това е само примерен източник на данни. Трябва да работи и на всеки друг тип източник на данни. - person Gregor Primar; 03.10.2012
comment
DataSourceID е задължителен, за да се използват тези функции (SortedAscendingHeaderStyle и т.н...) В моя код не използвам контрола на източник на данни, а по-скоро правя ръчно свързване на данни. - person Mark Marina; 03.10.2012
comment
@GregorPrimar: OP трябва да използва версия на asp.net, по-малка от 4.0 - person naveen; 05.10.2012
comment
При мен иконата със стрелка винаги се показва в горната част на текста на заглавката. Как мога да го принудя да се показва малко вдясно от края на текста? - person JonathanWolfson; 20.02.2013

За да добавите стрелка за сортиране в Data Grid във VB.net Windows Form, дори не е нужно да пишете никакъв код

  1. На формуляр в режим на проектиране - изберете мрежата, с която работите, щракнете с десния бутон върху свойствата, задайте Режим на избор = Избор на клетка
  2. На формуляр в режим на проектиране - щракнете върху стрелката върху мрежата вдясно нагоре, за да редактирате свойствата на колоната, изберете редактиране или добавяне на колони, задайте SortMode = Automatic
  3. Ако имате код за съдържанието на вашата клетка (да кажем, че искате потребителят да отвори друг формуляр, докато щрака върху произволен ред в мрежата с данни), тогава използвайте свойството CellDoubleClick, за да обработите събитието. Ако сте използвали едно кликване, то ще сортира заглавката и ще отвори формуляра за дадената клетка

Private Sub _CellDoubleClick(изпращач като обект, e като DataGridViewCellEventArgs) обработва DGAcctGrpList.CellDoubleClick

person Pramod Chandra    schedule 28.05.2015