2009-07-15 48 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