GridView сортировка: SortDirection всегда по возрастанию

Jeans расширяется Clothing. В вашем конструкторе Jeans вы пытаетесь вызвать конструктор в классе Clothing. Однако вы вызвали конструктор только с одним аргументом: super(size); В Clothing нет конструктора с одним аргументом.

Есть несколько способов исправить это.

Вариант 1: по умолчанию «цвет» в джинсах.

public Jeans(String size) {
    super( size, "Blue" );
}

Вариант 2: Добавить конструктор с одним аргументом в одежду.

public Clothing(String size) {
    this.size = size;
    this.color = "Blue"; // defaults all Clothing to blue unless otherwise specified
}

Вариант 3: добавить второй аргумент в конструктор Jeans и передать его в одежду.

public Jeans(String size, String color) {
    super(size, color);
}
66
задан Alex Angas 3 May 2015 в 12:23
поделиться

10 ответов

Можно использовать переменную сеанса для хранения последнего Выражения для сортировки и когда Вы сортируете сетку, следующий раз сравнивает выражение для сортировки сетки с Переменной сеанса, которая хранит последнее выражение для сортировки. Если столбцы равны, затем проверяют направление предыдущего вида и вида в противоположном направлении.

Пример:

DataTable sourceTable = GridAttendence.DataSource as DataTable;
DataView view = new DataView(sourceTable);
string[] sortData = ViewState["sortExpression"].ToString().Trim().Split(' ');
if (e.SortExpression == sortData[0])
{
    if (sortData[1] == "ASC")
    {
        view.Sort = e.SortExpression + " " + "DESC";
        this.ViewState["sortExpression"] = e.SortExpression + " " + "DESC";
    }
    else
    {
        view.Sort = e.SortExpression + " " + "ASC";
        this.ViewState["sortExpression"] = e.SortExpression + " " + "ASC";
    }
}
else
{
    view.Sort = e.SortExpression + " " + "ASC";
    this.ViewState["sortExpression"] = e.SortExpression + " " + "ASC";
}
33
ответ дан 24 November 2019 в 14:51
поделиться

Я устал от того, чтобы заниматься этой проблемой и поместил направление вида и столбец вида в ViewState....

1
ответ дан 24 November 2019 в 14:51
поделиться

Путем я сделал это подобно коду, что принятый ответ, если, бит несколько отличается так, я думал, что помещу его там также. Обратите внимание, что эта сортировка делается к DataTable, прежде чем она будет связана с GridView. DataSource.

Опция один: Использование ViewState

void DataGrid_Sorting(object sender, GridViewSortEventArgs e)
{
    if (e.SortExpression == (string)ViewState["SortColumn"])
    {
        // We are resorting the same column, so flip the sort direction
        e.SortDirection = 
            ((SortDirection)ViewState["SortColumnDirection"] == SortDirection.Ascending) ? 
            SortDirection.Descending : SortDirection.Ascending;
    }
    // Apply the sort
    this._data.DefaultView.Sort = e.SortExpression +
        (string)((e.SortDirection == SortDirection.Ascending) ? " ASC" : " DESC");
    ViewState["SortColumn"] = e.SortExpression;
    ViewState["SortColumnDirection"] = e.SortDirection;
}

Опция два: Использование сессии

Обратите внимание, что следующее обеспечивается для целей прежней версии, если Вы видите его в поле, или что Вы все еще поддерживаете системы компании, которые предназначаются для более старых браузеров.

void DataGrid_Sorting(object sender, GridViewSortEventArgs e)
{
    if (e.SortExpression == (string)HttpContext.Current.Session["SortColumn"])
    {
        // We are resorting the same column, so flip the sort direction
        e.SortDirection = 
            ((SortDirection)HttpContext.Current.Session["SortColumnDirection"] == SortDirection.Ascending) ? 
            SortDirection.Descending : SortDirection.Ascending;
    }
    // Apply the sort
    this._data.DefaultView.Sort = e.SortExpression +
        (string)((e.SortDirection == SortDirection.Ascending) ? " ASC" : " DESC");
    HttpContext.Current.Session["SortColumn"] = e.SortExpression;
    HttpContext.Current.Session["SortColumnDirection"] = e.SortDirection;
}
10
ответ дан 24 November 2019 в 14:51
поделиться

Для переключения возрастания и убывания я использую метод в BasePage своего приложения для кэширования направления вида и выражения для сортировки:

protected void SetPageSort(GridViewSortEventArgs e)
{
    if (e.SortExpression == SortExpression)
    {
        if (SortDirection == "ASC")
        {
            SortDirection = "DESC";
        }
        else
        {
            SortDirection = "ASC";
        }
    }
    else
    {
        SortDirection = "ASC";
        SortExpression = e.SortExpression;
    }
}

SortExpression и SortDirection являются оба свойствами в BasePage, которые хранят и получают их значения от ViewState.

Таким образом, все мои полученные страницы просто называют SetPageSort от Метода сортировки GridView и связывают GridView:

protected void gv_Sorting(object sender, GridViewSortEventArgs e)
{
    SetPageSort(e);
    BindGrid();
}

BindGrid проверяет SortExpression и использует его и SortDirection, чтобы сделать ORDERY на источнике данных сетки, чем-то вроде этого:

if (SortExpression.Length > 0)
{
    qry.ORDER_BY(SortExpression + " " + SortDirection);
}

gv.DataSource = qry.ExecuteReader();
gv.DataBind();

Так, SetPageSort базового класса удаляет большую часть тяжелой работы сортировки GridView. Я чувствую, что забываю что-то, но это - общее представление.

1
ответ дан 24 November 2019 в 14:51
поделиться

Это было некоторое время, так как я использовал GridView, но я думаю, что необходимо установить свойство SortDirection сетки на то, что это в настоящее время прежде оставляет методом OnSorting.

Так....

List<V_ReportPeriodStatusEntity> items = GetPeriodStatusesForScreenSelection();
items.Sort(new Helpers.GenericComparer<V_ReportPeriodStatusEntity>(e.SortExpression, e.SortDirection));
grdHeader.SortDirection = e.SortDirection.Equals(SortDirection.Ascending) ? SortDirection.Descending : SortDirection.Ascending;
grdHeader.DataSource = items;
grdHeader.DataBind();

1
ответ дан 24 November 2019 в 14:51
поделиться

Автоматический двунаправленный сортирующий только работает с источником данных SQL. К сожалению, вся документация в MSDN предполагает использование этого таким образом, GridView может стать немного печальным.

Путем я делаю это путем отслеживания порядок самостоятельно. Например:

    protected void OnSortingResults(object sender, GridViewSortEventArgs e)
    {
        // If we're toggling sort on the same column, we simply toggle the direction. Otherwise, ASC it is.
        // e.SortDirection is useless and unreliable (only works with SQL data source).
        if (_sortBy == e.SortExpression)
            _sortDirection = _sortDirection == SortDirection.Descending ? SortDirection.Ascending : SortDirection.Descending;
        else
            _sortDirection = SortDirection.Ascending;

        _sortBy = e.SortExpression;

        BindResults();
    }
19
ответ дан 24 November 2019 в 14:51
поделиться

Эта проблема отсутствует не только с источниками данных SQL, но и с Источниками Данных объектов также. Однако при установке DataSource динамично в коде, именно тогда это разлагается. К сожалению, MSDN иногда действительно очень плох на информации. Простое упоминание этого поведения (это не ошибка, а вопросы проектирования) сэкономило бы много времени. Во всяком случае я не очень склонен использовать Переменные сеанса для этого. Я обычно храню направление сортировки в ViewState.

15
ответ дан 24 November 2019 в 14:51
поделиться

Простое решение:

protected SortDirection GetSortDirection(string column)
{
    SortDirection nextDir = SortDirection.Ascending; // Default next sort expression behaviour.
    if (ViewState["sort"] != null && ViewState["sort"].ToString() == column)
    {   // Exists... DESC.
        nextDir = SortDirection.Descending;
        ViewState["sort"] = null;
    }
    else
    {   // Doesn't exists, set ViewState.
        ViewState["sort"] = column;
    }
    return nextDir;
}

Очень похоже на сортировку GridView по умолчанию и облегченный режим ViewState.

ИСПОЛЬЗОВАНИЕ:

protected void grdHeader_OnSorting(object sender, GridViewSortEventArgs e)
{
    List<V_ReportPeriodStatusEntity> items = GetPeriodStatusesForScreenSelection();

    items.Sort(new Helpers.GenericComparer<V_ReportPeriodStatusEntity>(e.SortExpression, GetSortDirection(e.SortExpression));
    grdHeader.DataSource = items;
    grdHeader.DataBind();
}
20
ответ дан 24 November 2019 в 14:51
поделиться

Проблема с Session и Viewstate заключается в том, что вам также необходимо отслеживать элемент управления gridview, для которого хранятся SortColumn и Direction, если на странице имеется более одного представления сетки.

Альтернативой Session и Viewstate является добавление 2 атрибутов в Gridview и отслеживание таким образом столбца и направления.

Вот пример:

private void GridViewSortDirection(GridView g, GridViewSortEventArgs e, out SortDirection d, out string f)
{
    f = e.SortExpression;
    d = e.SortDirection;

    //Check if GridView control has required Attributes
    if (g.Attributes["CurrentSortField"] != null && g.Attributes["CurrentSortDir"] != null)
    {
        if (f == g.Attributes["CurrentSortField"])
        {
            d = SortDirection.Descending;
            if (g.Attributes["CurrentSortDir"] == "ASC")
            {
                d = SortDirection.Ascending;
            }
        }

        g.Attributes["CurrentSortField"] = f;
        g.Attributes["CurrentSortDir"] = (d == SortDirection.Ascending ? "DESC" : "ASC");
    }

}
51
ответ дан 24 November 2019 в 14:51
поделиться

У меня была ужасная проблема с этим, поэтому я, наконец, прибег к использованию LINQ, чтобы упорядочить DataTable перед назначением его представлению:

Dim lquery = From s In listToMap
             Select s
             Order By s.ACCT_Active Descending, s.ACCT_Name

В частности, я действительно нашел DataView.Sort и DataGrid. Методы сортировки ненадежны при сортировке логического поля.

Надеюсь, это кому-то поможет.

0
ответ дан 24 November 2019 в 14:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: