sortowanie i stronicowanie z gridview asp.net

Próbuję uzyskać GridView do sortowania i strony ręcznie bez powodzenia.

Problem polega na tym, że gdy użytkownik kliknie kolumnę, którą chce posortować, sortuje tę stronę, ale nie sortuje źródła danych (dataview) za gridview. Więc kiedy przechodzą do innej strony, ich rodzaj jest tracony. Prawie Szukam sortowania, które faktycznie posortuje źródło danych za gridview. Oto co mam do tej pory:

protected void GridView_OnSort(object sender, GridViewSortEventArgs e)
    {
        String sortExpression = e.SortExpression;

        if (GridViewSortDirection == SortDirection.Ascending)
        {
            DataView myDataView = new DataView(mybll.GetItemsOrdered());
            myDataView.Sort = sortExpression + " DESC";
            GridView.DataSource = myDataView;
            GridView.DataBind();
        }
        else
        {
            DataView myDataView = new DataView(mybll.GetItemsOrdered());
            myDataView.Sort = sortExpression + " ASC";
            GridView.DataSource = myDataView;
            GridView.DataBind();
        }
    }
Każda pomoc będzie mile widziana. Dzięki.
Author: dangerisgo, 2009-03-31

5 answers

Zapisz kolejność sortowania w ViewState.

private const string ASCENDING = " ASC";
private const string DESCENDING = " DESC";

public SortDirection GridViewSortDirection
{
    get
    {
        if (ViewState["sortDirection"] == null)
            ViewState["sortDirection"] = SortDirection.Ascending;

        return (SortDirection) ViewState["sortDirection"];                
    }
    set { ViewState["sortDirection"] = value; } 
}

protected void GridView_Sorting(object sender, GridViewSortEventArgs e)
{
    string sortExpression = e.SortExpression;

    if (GridViewSortDirection == SortDirection.Ascending)
    {
        GridViewSortDirection = SortDirection.Descending;
        SortGridView(sortExpression, DESCENDING);
    }
    else
    {
        GridViewSortDirection = SortDirection.Ascending;
        SortGridView(sortExpression, ASCENDING); 
    }   

}

private void SortGridView(string sortExpression,string direction)
{
    //  You can cache the DataTable for improving performance
    DataTable dt = GetData().Tables[0]; 

    DataView dv = new DataView(dt); 
    dv.Sort = sortExpression + direction;         

    GridView1.DataSource = dv;
    GridView1.DataBind();         
}

Dlaczego nie chcesz korzystać z istniejącej funkcji sortowania? Zawsze możesz go dostosować.

Sortowanie danych w kontrolce serwera www GridView w MSDN

Oto przykład z dostosowaniem:

Http://www.netomatix.com/development/GridViewSorting.aspx

 53
Author: Konstantin Tarkus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-31 19:19:29
<asp:GridView 
    ID="GridView1" runat="server" AutoGenerateColumns="false" AllowSorting="True" onsorting="GridView1_Sorting" EnableViewState="true"> 
    <Columns>
        <asp:BoundField DataField="bookid" HeaderText="BOOK ID"SortExpression="bookid"  />
        <asp:BoundField DataField="bookname" HeaderText="BOOK NAME" />
        <asp:BoundField DataField="writer" HeaderText="WRITER" />
        <asp:BoundField DataField="totalbook" HeaderText="TOTALBOOK" SortExpression="totalbook"  />
        <asp:BoundField DataField="availablebook" HeaderText="AVAILABLE BOOK" />
    </Columns>
</asp:GridView>

Kod za:

protected void Page_Load(object sender, EventArgs e) {
        if (!IsPostBack) {
            string query = "SELECT * FROM book";
            DataTable DT = new DataTable();
            SqlDataAdapter DA = new SqlDataAdapter(query, sqlCon);
            DA.Fill(DT);

            GridView1.DataSource = DT;
            GridView1.DataBind();
        }
    }

    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) {

        string query = "SELECT * FROM book";
        DataTable DT = new DataTable();
        SqlDataAdapter DA = new SqlDataAdapter(query, sqlCon);
        DA.Fill(DT);

        GridView1.DataSource = DT;
        GridView1.DataBind();

        if (DT != null) {
            DataView dataView = new DataView(DT);
            dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);

            GridView1.DataSource = dataView;
            GridView1.DataBind();
        }
    }

    private string GridViewSortDirection {
        get { return ViewState["SortDirection"] as string ?? "DESC"; }
        set { ViewState["SortDirection"] = value; }
    }

    private string ConvertSortDirectionToSql(SortDirection sortDirection) {
        switch (GridViewSortDirection) {
            case "ASC":
                GridViewSortDirection = "DESC";
                break;

            case "DESC":
                GridViewSortDirection = "ASC";
                break;
        }

        return GridViewSortDirection;
    }
}
 5
Author: AVIK GHOSH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-05 00:08:22

Znalazłem znacznie łatwiejszy sposób, który pozwala nadal korzystać z wbudowanego sortowania / stronicowania standardowego gridview...

Utwórz 2 etykiety. ustaw je na visible = false. Nazwałem swój lblSort1 i lblSortDirection1

Następnie Zakoduj 2 proste zdarzenia... sortowanie stron, które zapisuje do tekstu niewidocznych etykiet, oraz zmiana indeksu stron, które ich używa...

Private Sub gridview_Sorting(sender As Object, e As GridViewSortEventArgs) Handles gridview.Sorting
lblSort1.Text = e.SortExpression
lblSortDirection1.Text = e.SortDirection
End Sub

Private Sub gridview_PageIndexChanging(sender As Object, e As GridViewPageEventArgs) Handles gridview.PageIndexChanging
    gridview.Sort(lblSort1.Text, CInt(lblSortDirection1.Text))
End Sub

Jest to trochę niechlujne niż używanie zmiennych globalnych, ale odkryłem z asp szczególnie, że globalne var-y są zawodne...

 0
Author: Jon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-22 18:52:22

Bardziej prosty sposób...:

    Dim dt As DataTable = DirectCast(GridView1.DataSource, DataTable)
    Dim dv As New DataView(dt)

    If GridView1.Attributes("dir") = SortDirection.Ascending Then
        dv.Sort = e.SortExpression & " DESC" 
        GridView1.Attributes("dir") = SortDirection.Descending

    Else
        GridView1.Attributes("dir") = SortDirection.Ascending
        dv.Sort = e.SortExpression & " ASC"

    End If

    GridView1.DataSource = dv
    GridView1.DataBind()
 0
Author: Ranjeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-14 00:49:52

Odpowiedź Tarkusa działa dobrze. Sugerowałbym jednak zastąpienie VIEWSTATE sesją.

VIEWSTATE bieżącej strony działa tylko wtedy, gdy bieżąca strona wraca do siebie i zniknie, gdy użytkownik zostanie przekierowany na inną stronę. Sesja utrzymuje kolejność sortowania nie tylko po stronie bieżącej. Utrzymuje go przez cały czas trwania sesji. Oznacza to, że użytkownik może surfować po innych stronach, a kiedy wraca do danej strony, porządek sortowania, którego ostatnio użył, nadal pozostaje. Zwykle jest to wygodniejsze.

Istnieją również inne metody, takie jak utrzymywanie profili użytkowników.

Polecam ten artykuł dla bardzo dobrego wyjaśnienia ViewState i jak to działa z cyklem życia Strony: https://msdn.microsoft.com/en-us/library/ms972976.aspx

Aby zrozumieć różnicę między VIEWSTATE, SESSION i innymi sposobami utrzymywania zmiennych, polecam ten artykuł: https://msdn.microsoft.com/en-us/library/75x4ha6s.aspx

 0
Author: Jeff Matthews,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-02 03:42:50