Реализация пользовательской сортировки для WinForms ListView - PullRequest
0 голосов
/ 15 июля 2009

У меня есть класс с именем Picture, который имеет имя и свойство size (int).

Я собирался отсортировать их по размеру, но не по отображаемому имени файла, которое является именем элемента в listview.

Я реализовал IComparer<Picture> для типа Picture, а затем, когда я пишу это:

this.PicList.ListViewItemSorter = AllPictures[0];

или

this.PicList.ListViewItemSorter = Picture;

они не компилируются.

Как мне это сделать? На MSDN он показывает отдельный класс для сортировщика, но я могу сделать это встроенным с используемым типом Picture?

Ответы [ 3 ]

1 голос
/ 15 июля 2009

Другая реализация, которую вы можете попробовать, - это связать каждый индекс ListViewItem с вашим пользовательским экземпляром класса / структуры, хранящимся в экземпляре Dictionary<int, Picture>. Ваш собственный класс сортировщика представления списка может быть написан с учетом этого:

public partial class Form1 : Form
{
    public Form1()
    {
        ...

        ListView lv = new ListView();
        lv.ListViewItemSorter = new MyCustomSorter(this);
    }

    private Dictionary<int, Picture> _pictures = new Dictionary<int,Picture>();

    private class MyCustomSorter : IComparer
    {
        private Form1 _parent;

        internal MyCustomSorter(Form1 form)
        {
            _parent = form;
        }

        #region IComparer Members

        public int Compare(object x, object y)
        {
            ListViewItem item1 = x as ListViewItem;
            ListViewItem item2 = y as ListViewItem;

            if (x != null)
            {
                if (y != null)
                {
                    Picture p1 = _parent._pictures[item1.Index];
                    Picture p2 = _parent._pictures[item2.Index];

                    return string.Compare(p1.Location, p2.Location);
                }

                // X is deemed "greater than" y
                return 1;
            }
            else if (y != null)
                return -1;      // x is "less than" y

            return 0;
        }

        #endregion
    }
}

public class Picture
{
    private string _location;

    public string Location{
        get { return _location; }
    }
}
1 голос
/ 15 июля 2009

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

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

1 голос
/ 15 июля 2009

вам нужно указать фактический экземпляр класса Picture, а не его тип. Кроме того, ваш ListViewItemSorter на самом деле вызовет Comparer, передав ему ListViewItem, а не класс Picture, вы можете добавить экземпляр класса Picture в свойство Tag вашего ListViewItem.

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

Picture test1 = new Picture() { Name = "Picture #1", Size = 54 };
Picture test2 = new Picture() { Name = "Picture #2", Size = 10 };

this.listView1.ListViewItemSorter = test1;

this.listView1.Items.Add(new ListViewItem(test1.Name) { Tag = test1 });
this.listView1.Items.Add(new ListViewItem(test2.Name) { Tag = test2 });

 public class Picture : IComparer
    {
        public string Name { get; set; }
        public int Size { get; set; }

        #region IComparer Members

        public int Compare(object x, object y)
        {
            Picture itemA = ((ListViewItem)x).Tag as Picture;
            Picture itemB = ((ListViewItem)y).Tag as Picture;

            if (itemA.Size < itemB.Size)
                return -1;

            if (itemA.Size > itemB.Size)
                return 1;

            if (itemA.Size == itemB.Size)
                return 0;

            return 0;

        }

Вывод:

  • Фото № 2
  • Picture # 1

Вот ссылка MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...