Как сохранить состояние сортировки GridView? (По возрастанию, по убыванию)

У меня есть проблема, которая беспокоила меня в течение достаточно долгого времени, и я остро нуждаюсь в помощи, потому что я новичок в.NET.

Я использую GridView для отображения результатов запроса. Однако вместо того, чтобы вводить его непосредственно в источник данных сущности /LINQ, я вручную кодирую такие события, как Загрузка, Сортировка и Пейджинг. Проблема в сортировке, я не могу сохранить восходящее / нисходящее состояние. Одним из возможных решений, которое я могу придумать, является кэширование состояния, однако я чувствую, что есть другой способ, который более опрятен. Таким образом, вы, ребята, можете предложить мне другие идеи, которые подходят лучше?

Заранее большое спасибо! Ниже приведен код, который я использую для сортировки. По-видимому, e.SortDirection всегда будет равняться ascending независимо от того, сколько раз я нажал на заголовок столбца.

switch (e.SortExpression)
        {
            case "Album":
                if (e.SortDirection == SortDirection.Ascending)
                    _orderedResult = from doc in _result
                                     orderby doc.DocumentAlbum.Name ascending
                                     select doc;
                else
                    _orderedResult = from doc in _result
                                     orderby doc.DocumentAlbum.Name descending
                                     select doc;
                break;
            case "Category":
                if (e.SortDirection == SortDirection.Ascending)
                    _orderedResult = from doc in _result
                                     orderby doc.DocumentCategory.Name ascending
                                     select doc;
                else
                    _orderedResult = from doc in _result
                                     orderby doc.DocumentCategory.Name descending
                                     select doc;
                break;
            case "Title":
                if (e.SortDirection == SortDirection.Ascending)
                    _orderedResult = from doc in _result
                                     orderby doc.Title ascending
                                     select doc;
                else
                    _orderedResult = from doc in _result
                                     orderby doc.Title descending
                                     select doc;
                break;
            case "Description":
                if (e.SortDirection == SortDirection.Ascending)
                    _orderedResult = from doc in _result
                                     orderby doc.Description ascending
                                     select doc;
                else
                    _orderedResult = from doc in _result
                                     orderby doc.Description descending
                                     select doc;
                break;
            case "DateCreated":
                if (e.SortDirection == SortDirection.Ascending)
                    _orderedResult = from doc in _result
                                     orderby doc.DateCreated ascending
                                     select doc;
                else
                    _orderedResult = from doc in _result
                                     orderby doc.DateCreated descending
                                     select doc;
                break;
            case "DateUpdated":
                if (e.SortDirection == SortDirection.Ascending)
                    _orderedResult = from doc in _result
                                     orderby doc.DateUpdated ascending
                                     select doc;
                else
                    _orderedResult = from doc in _result
                                     orderby doc.DateUpdated descending
                                     select doc;
                break;

        }

3 ответа

На самом деле, я только что нашел ответ. Я использовал функцию ViewState, чтобы отслеживать состояние. Это функция, которую я использовал:

private SortDirection GetSortDirection(string column)
    {
        // By default, set the sort direction to ascending
        SortDirection _sortDirection = SortDirection.Ascending;

        // Retrieve the last column that was sorted
        string _sortExpression = ViewState["SortExpression"] as string;

        if (_sortExpression != null)
        {
            // Check if the same column is being sorted.
            // Otherwise, the default value can be returned.
            if (_sortExpression == column)
            {
                string _lastDirection = ViewState["SortDirection"] as string;
                if ((_lastDirection != null) && (_lastDirection == "ASC"))
                {
                    _sortDirection = SortDirection.Descending;
                }
            }
        }

        // Save new values in ViewState.
        ViewState["SortDirection"] = _sortDirection.ToString();
        ViewState["SortExpression"] = column;

        return _sortDirection;
    }
protected void gvOfflineSub_Sorting(object sender, GridViewSortEventArgs e)
    {
        IList<SellerDetails> Ilist = gvOfflineSub.DataSource as IList<SellerDetails>;
        DataTable dt = ToDataTable<SellerDetails>(Ilist);
        if (dt != null)
        {
            DataView dataView = new DataView(dt);
            dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);

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

    /// <summary>
    /// Description:Following Method is for Sorting Gridview.
    /// </summary>
    /// <param name="sortDirection"></param>
    /// <returns></returns>
    private string ConvertSortDirectionToSql(SortDirection sortDirection)
    {
        string newSortDirection = String.Empty;

        switch (sortDirection)
        {
            case SortDirection.Ascending:
                newSortDirection = "ASC";
                break;

            case SortDirection.Descending:
                newSortDirection = "DESC";
                break;
        }
        return newSortDirection;
    }

Если вы используете LINQ, то очень просто отсортировать привязку сетки, как это

var data = (from d in edc.TableName
                select new
                {
                    d.Address,
                    d.InsertedDate,                        
                    d.ID
                }).OrderByDescending(d => d.ID);
    if (data != null)
    {
        grdList.DataSource = data;
        grdList.DataBind();
    }
Другие вопросы по тегам