как я сортирую Целые числа в listview

Браузер читает Ваш HTML с начала до конца и может выполнить его, поскольку он читается и анализируется в исполняемые блоки (объявления переменной, функциональные определения, и т.д.), Но в любой точке может только использовать то, что было определено в сценарии перед той точкой.

Это отличается от других контекстов программирования, которые обрабатывают (компилируют) весь Ваш исходный код, возможно, связывают его вместе с любыми библиотеками, необходимо разрешить ссылки и создать исполняемый модуль, в котором начинается выполнение точки.

Ваш код может относиться к именованным объектам (переменные, другие функции, и т.д.), которые определяются далее вперед, но Вы не можете выполнить относящийся код, пока все части не доступны.

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

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

6
задан Fredrik Mörk 31 July 2009 в 19:28
поделиться

4 ответа

Вот как я добился того, что смог сортировать по нескольким столбцам и по каждому столбец в виде числа или текста.

Сначала используйте этот класс:

class Sorter : System.Collections.IComparer
{
    public int Column = 0;
    public System.Windows.Forms.SortOrder Order = SortOrder.Ascending;
    public int Compare(object x, object y) // IComparer Member
    {
        if (!(x is ListViewItem))
            return (0);
        if (!(y is ListViewItem))
            return (0);

        ListViewItem l1 = (ListViewItem)x;
        ListViewItem l2 = (ListViewItem)y;

        if (l1.ListView.Columns[Column].Tag == null)
        {
            l1.ListView.Columns[Column].Tag = "Text";
        }

        if (l1.ListView.Columns[Column].Tag.ToString() == "Numeric")
        {
            float fl1 = float.Parse(l1.SubItems[Column].Text);
            float fl2 = float.Parse(l2.SubItems[Column].Text);

            if (Order == SortOrder.Ascending)
            {
                return fl1.CompareTo(fl2);
            }
            else
            {
                return fl2.CompareTo(fl1);
            }
        }
        else
        {
            string str1 = l1.SubItems[Column].Text;
            string str2 = l2.SubItems[Column].Text;

            if (Order == SortOrder.Ascending)
            {
                return str1.CompareTo(str2);
            }
            else
            {
                return str2.CompareTo(str1);
            }
        }
    }
}

В конструкторе формы установите сортировщик следующим образом:

lvSeries.ListViewItemSorter = new Sorter();

Затем обработайте ColumnClick даже элемента управления списком следующим образом:

private void lvSeries_ColumnClick(object sender, ColumnClickEventArgs e)
    {
        Sorter s = (Sorter)lvSeries.ListViewItemSorter;
        s.Column = e.Column;

        if (s.Order == System.Windows.Forms.SortOrder.Ascending)
        {
            s.Order = System.Windows.Forms.SortOrder.Descending;
        }
        else
        {
            s.Order = System.Windows.Forms.SortOrder.Ascending;
        }
        lvSeries.Sort();
    }

Это все зависит от свойства Tag каждого столбца, для которого установлено значение "Numeric" или нет, поэтому сортировщик знает, как сортировать.

В приведенном выше примере я приводил значения как float, когда числовые, вы можете изменить это на внутр.

19
ответ дан 8 December 2019 в 03:54
поделиться

Я бы сделал это в источнике данных (модели) вместо представления. Отсортируйте его там, и он должен обновить его в представлении посредством привязки данных.

0
ответ дан 8 December 2019 в 03:54
поделиться

Если вы только начинаете работать с ListView, ваша жизнь будет намного проще, если вы будете использовать вместо него ObjectListView . ObjectListView - это оболочка с открытым исходным кодом для .NET WinForms ListView, которая решает все эти раздражающие небольшие проблемы, которые обычно делают работу с ListView такой разочаровывающей. Например, он автоматически сортирует целые числа так, что после «3» идет «100» (DateTimes, bools и все остальное тоже сортируются правильно).

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

Да, я являюсь автором, но это не значит, что я предвзят ... Хорошо, может быть, это так :) Посмотрите здесь , чтобы узнать мнение некоторых других людей.

5
ответ дан 8 December 2019 в 03:54
поделиться

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

public class IntegerComparer : IComparer
{
    private int _colIndex;
    public IntegerComparer(int colIndex)
    {
        _colIndex = colIndex;
    }
    public int Compare(object x, object y)
    {
        int nx = int.Parse((x as ListViewItem).SubItems[_colIndex].Text);
        int ny = int.Parse((y as ListViewItem).SubItems[_colIndex].Text);
        return nx.CompareTo(ny);
    }
}

Затем вы назначаете такой компаратор свойству ListViewItemSorter и вызываете метод сортировки для элемент управления ListView:

// create a comparer for column index 1 and assign it to the control, and sort
myListView.ListViewItemSorter = new IntegerComparer(1);
myListView.Sort();
3
ответ дан 8 December 2019 в 03:54
поделиться
Другие вопросы по тегам:

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