Подтвердить что ты не робот

Сортировка и пейджинг с gridview asp.net

Я пытаюсь получить gridview для сортировки и страницы вручную без успеха.

Проблема заключается в том, что когда пользователь нажимает на столбец, который они хотят сортировать, он сортирует эту страницу, но не сортирует источник данных (dataview) за gridview. Поэтому, когда они переходят на другую страницу, их вид теряется. В значительной степени я ищу сортировку, которая фактически сортирует источник данных за gridview. Вот что я до сих пор:

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

Любая помощь будет оценена по достоинству. Спасибо.

4b9b3361

Ответ 1

Сохраните порядок сортировки в 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();         
}

Почему вы не хотите использовать существующую функцию сортировки? Вы всегда можете настроить его.

Сортировка данных в управлении веб-сервером GridView в MSDN

Вот пример с настройкой:

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

Ответ 2

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

Код позади:

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

Ответ 3

Я нашел намного более простой способ, который позволяет вам использовать встроенную сортировку/просмотр страниц стандартного gridview...

создать 2 метки. установите их видимыми = false. Я назвал мой lblSort1 и lblSortDirection1

затем код 2 простых события... сортировка страницы, которая записывает текст невидимых меток и изменение индекса страницы, которое их использует...

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

это немного sloppier, чем использование глобальных переменных, но я нашел с asp особенно, что глобальные вары, ну, ненадежны...

Ответ 4

Более простой способ...:

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

Ответ 5

Ответ Таркуса хорошо работает. Однако я бы предложил заменить VIEWSTATE на СЕССИИ.

Текущая страница VIEWSTATE работает только тогда, когда текущая страница возвращается к себе и исчезает, как только пользователь перенаправляется на другую страницу. SESSION сохраняет порядок сортировки не только на текущей странице после обратной связи. Он сохраняется в течение всего сеанса. Это означает, что пользователь может путешествовать по другим страницам, и когда он возвращается к данной странице, порядок сортировки, который он в последний раз использовал, по-прежнему остается. Это обычно более удобно.

Существуют и другие методы, такие как постоянные профили пользователей.

Я рекомендую эту статью для очень хорошего объяснения ViewState и того, как она работает с жизненным циклом веб-страницы: https://msdn.microsoft.com/en-us/library/ms972976.aspx

Чтобы понять разницу между VIEWSTATE, SESSION и другими способами сохраняющихся переменных, я рекомендую эту статью: https://msdn.microsoft.com/en-us/library/75x4ha6s.aspx