2009-07-15 66 views
0

我有一个名为Picture的类,它有一个名称和sizeint)属性。为WinForms实现自定义排序ListView

我打算使用大小对它们进行排序,但不是listview中的项目名称显示的文件名。

我实现IComparer<Picture>Picture类型,然后当我写这篇文章:

this.PicList.ListViewItemSorter = AllPictures[0]; 

this.PicList.ListViewItemSorter = Picture; 

他们不进行编译。

我该怎么做?在MSDN上它为分拣机显示了一个单独的类,但我可以使用内置的类型Picture吗?

+0

图片是一种类型?你需要给它一个Picture的实例,而不是类型。什么是错误? – 2009-07-15 00:29:41

+0

是的,这是一个结构。该错误是无法将图片转换为IComparer。在#1中,我传递了一个不起作用的实例。 – 2009-07-15 00:31:23

+0

为什么有人低估了它?这是一个有效的问题。 – 2009-07-15 09:15:31

回答

1

你需要给它一个Picture类的实例,而不是类型。此外,您的ListViewItemSorter实际上会通过将ListViewItem而不是Picture类传递给比较器,您可以将Picture类的实例添加到ListViewItem的Tag属性中。

就像这样,这是一个非常粗糙的实现,只是为了给你一个想法。你可以实现你自己的错误处理。

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
  • 图片#1

这里是一个MSDN Link

+0

谢谢。这是我需要的。这让我意识到排序不应该是图片类型的一部分。我认为它使用图片类型,而不是ListViewItem。现在很明显。 – 2009-07-15 09:14:49

1

你可以尝试另一种实现是每个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

斯坦的解决方案将工作,但是,代表用户的,我强烈建议你不要硬编码排序顺序。在ListView中,每个人都希望能够通过单击标题进行排序。

ObjectListView(.NET WinForms ListView的开放源代码包装)提供免费的排序功能。如果您想要,它甚至可以在自己的专栏中显示您的照片的缩略图。

+0

是的。我完全同意。我只是向他展示了一个实现以及为什么他不工作。但我同意它应该在列标题上完成。 – 2009-07-15 12:56:27