Сортировка ListView столбцом

, Если Вы обеспечиваете код XSLT и XML-документ, относительно которого Вы наблюдаете проблему, я и другие люди могли попытаться помочь .

Вот являются [приблизительно 1 111] подсказками по использованию и производительности XSLT от [1 112] Michael Kay :

Восемь подсказок для того, как использовать XSLT эффективно :

  1. Сохраняют исходные документы маленькими. Если необходимое разделение документ сначала.
  2. Сохраняют процессор XSLT (и Java VM) загруженный в памяти между выполнениями
  3. , Если Вы неоднократно используете ту же таблицу стилей, скомпилируйте его сначала.
  4. при использовании того же исходного документа неоднократно сохраните его в памяти.
  5. при выполнении того же преобразования неоднократно не делать. Сохраните результат вместо этого.
  6. Сохраняют выходной документ маленьким. Например, при генерации HTML используйте CSS.
  7. Никогда не проверяют тот же исходный документ несколько раз.
  8. преобразования комплекса Разделения в несколько этапов.

Восемь подсказок для того, как записать эффективный X SLT:

  1. Избегают повторенного использования" //item".
  2. не оценивают тот же набор узлов несколько раз; сохраните его в переменной.
  3. Избегают , если Вы можете. Например, при помощи position().
  4. Использование , например, для решения группирующихся проблем.
  5. Избегают сложных шаблонов в шаблонных правилах. Вместо этого используйте в правиле.
  6. Быть осторожным при использовании preceding[-sibling] или following[-sibling] оси. Это часто указывает на алгоритм с n - производительность в квадрате.
  7. не сортируют тот же набор узлов несколько раз. При необходимости сохраните его в результате древовидный фрагмент и получите доступ к нему с помощью node-set() дополнительная функция.
  8. Для вывода текстового значения простого #PCDATA элемента используйте в предпочтении к [1 110].

18
задан Mike 10 October 2009 в 16:00
поделиться

5 ответов

Если вы начинаете с ListView, сделайте себе огромное одолжение и используйте вместо него ObjectListView . ObjectListView - это оболочка с открытым исходным кодом для .NET WinForms ListView, которая значительно упрощает использование ListView и решает для вас множество типичных проблем. Сортировка по щелчку столбца - одна из многих вещей, которые она выполняет автоматически.

Серьезно, вы никогда не пожалеете об использовании ObjectListView вместо обычного ListView.

20
ответ дан 30 November 2019 в 06:09
поделиться

Use the ListView.SortExpression.

When multiple columns are sorted, this property contains a comma-separated list of the fields to sort by.

0
ответ дан 30 November 2019 в 06:09
поделиться

Я сортирую, используя имя столбца, чтобы установить любые особенности сортировки, которые могут потребоваться обработать, в зависимости от типа данных, хранящегося в столбце, и / или если столбец уже был отсортирован (asc / desc). Вот фрагмент из моего обработчика событий ColumnClick.

private void listView_ColumnClick(object sender, ColumnClickEventArgs e)
    {
        ListViewItemComparer sorter = GetListViewSorter(e.Column);

        listView.ListViewItemSorter = sorter;
        listView.Sort();
    }

    private ListViewItemComparer GetListViewSorter(int columnIndex)
    {
        ListViewItemComparer sorter = (ListViewItemComparer)listView.ListViewItemSorter;
        if (sorter == null)
        {
            sorter = new ListViewItemComparer();
        }

        sorter.ColumnIndex = columnIndex;

        string columnName = packagedEstimateListView.Columns[columnIndex].Name;
        switch (columnName)
        {
            case ApplicationModel.DisplayColumns.DateCreated:
            case ApplicationModel.DisplayColumns.DateUpdated:
                sorter.ColumnType = ColumnDataType.DateTime;
                break;
            case ApplicationModel.DisplayColumns.NetTotal:
            case ApplicationModel.DisplayColumns.GrossTotal:
                sorter.ColumnType = ColumnDataType.Decimal;
                break;
            default:
                sorter.ColumnType = ColumnDataType.String;
                break;
        }

        if (sorter.SortDirection == SortOrder.Ascending)
        {
            sorter.SortDirection = SortOrder.Descending;
        }
        else
        {
            sorter.SortDirection = SortOrder.Ascending;
        }

        return sorter;
    }

Ниже мой ListViewItemComparer

public class ListViewItemComparer : IComparer
{
    private int _columnIndex;
    public int ColumnIndex
    {
        get
        {
            return _columnIndex;
        }
        set
        {
            _columnIndex = value;
        }
    }

    private SortOrder _sortDirection;
    public SortOrder SortDirection
    {
        get
        {
            return _sortDirection;
        }
        set
        {
            _sortDirection = value;
        }
    }

    private ColumnDataType _columnType;
    public ColumnDataType ColumnType
    {
        get
        {
            return _columnType;
        }
        set
        {
            _columnType = value;
        }
    }


    public ListViewItemComparer()
    {
        _sortDirection = SortOrder.None;
    }

    public int Compare(object x, object y)
    {
        ListViewItem lviX = x as ListViewItem;
        ListViewItem lviY = y as ListViewItem;

        int result;

        if (lviX == null && lviY == null)
        {
            result = 0;
        }
        else if (lviX == null)
        {
            result = -1;
        }

        else if (lviY == null)
        {
            result = 1;
        }

        switch (ColumnType)
        {
            case ColumnDataType.DateTime:
                DateTime xDt = DataParseUtility.ParseDate(lviX.SubItems[ColumnIndex].Text);
                DateTime yDt = DataParseUtility.ParseDate(lviY.SubItems[ColumnIndex].Text);
                result = DateTime.Compare(xDt, yDt);
                break;

            case ColumnDataType.Decimal:
                Decimal xD = DataParseUtility.ParseDecimal(lviX.SubItems[ColumnIndex].Text.Replace("$", string.Empty).Replace(",", string.Empty));
                Decimal yD = DataParseUtility.ParseDecimal(lviY.SubItems[ColumnIndex].Text.Replace("$", string.Empty).Replace(",", string.Empty));
                result = Decimal.Compare(xD, yD);
                break;
            case ColumnDataType.Short:
                short xShort = DataParseUtility.ParseShort(lviX.SubItems[ColumnIndex].Text);
                short yShort = DataParseUtility.ParseShort(lviY.SubItems[ColumnIndex].Text);
                result = xShort.CompareTo(yShort);
                break;
            case ColumnDataType.Int:
                int xInt = DataParseUtility.ParseInt(lviX.SubItems[ColumnIndex].Text);
                int yInt = DataParseUtility.ParseInt(lviY.SubItems[ColumnIndex].Text);
                return xInt.CompareTo(yInt);
                break;
            case ColumnDataType.Long:
                long xLong = DataParseUtility.ParseLong(lviX.SubItems[ColumnIndex].Text);
                long yLong = DataParseUtility.ParseLong(lviY.SubItems[ColumnIndex].Text);
                return xLong.CompareTo(yLong);
                break;
            default:

                result = string.Compare(
                    lviX.SubItems[ColumnIndex].Text,
                    lviY.SubItems[ColumnIndex].Text,
                    false);

                break;
        }

        if (SortDirection == SortOrder.Descending)
        {
            return -result;
        }
        else
        {
            return result;
        }
    }
}
6
ответ дан 30 November 2019 в 06:09
поделиться

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

0
ответ дан 30 November 2019 в 06:09
поделиться

Забудьте о своем пользовательском сортировщике. Начните сначала, используя код на следующей странице. Он покажет вам, как определить класс, который наследуется от интерфейса IComparer. Каждая строка прокомментирована, так что вы можете видеть, что происходит. Единственная потенциальная сложность заключается в том, как вы получаете элементы Listview из элемента управления Listview. Устраните эти проблемы, и вам останется только скопировать и вставить класс интерфейса IComparer и метод columnClick.

http://support.microsoft.com/kb/319401

23
ответ дан 30 November 2019 в 06:09
поделиться
Другие вопросы по тегам:

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