2009-07-15 6 views
0

私はPictureというクラスがあり、その名前はsizeint)です。WinForms ListViewのカスタムソートの実装

サイズを使用して並べ替えようとしましたが、表示されているファイル名ではなく、listviewの項目名です。

私はPictureタイプにIComparer<Picture>を実施し、そして私はこの書くとき、次に:

this.PicList.ListViewItemSorter = AllPictures[0]; 

または

this.PicList.ListViewItemSorter = Picture; 

を彼らはコンパイルされません。

どうすればよいですか? MSDNではソーター用に別のクラスが表示されますが、使用済みのタイプPictureでビルトインできますか?

+0

画像はタイプですか?タイプではなく、Pictureのインスタンスを与える必要があります。エラーは何ですか? –

+0

はい、構造体です。エラーはPicture to IComparerを変換できません。 #1では、私は動作しない画像のインスタンスを渡しています。 –

+0

なぜ誰かがそれを落としたのですか?それは有効な質問です。 –

答えて

1

ピクチャクラスの実際のインスタンスではなく、その型を渡す必要があります。また、ListViewItemSorterは、PictureクラスではなくListViewItemを渡してComparerを実際に呼び出すので、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

はあなたが試すことができます別の実装では、各ListViewItemを関連付けることであるMSDN Link

+0

ありがとうございます。これが私の必要なものです。これにより、並べ替えがピクチャタイプの一部であってはならないことが分かりました。私はListViewItemではなく、ピクチャタイプを使用していると思っていました。今それは明らかです。 –

1

ですあなたのカスタムクラス/構造体インスタンスに格納されているインデックス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

スタンのソリューションが動作しますが、あなたのユーザーのために、私はあなたがハードソート順をコーディングしない強くお勧めしたい:カスタムリストビューソータークラスはそうのようなことを念頭に置いて書くことができます。リストビューでは、誰もがヘッダーをクリックして並べ替えることができると期待しています。

ObjectListView(.NET WinForms ListViewのオープンソースラッパー)は、ソートオンクリック機能を無料で提供します。あなたが望むのであれば、自分の写真のサムネイルを自分のコラムに表示することさえできます。

+0

はい。同意します。私は彼に実装を示し、彼はなぜ機能していないのかを示しました。しかし、私はそれが列ヘッダーで行われる必要があることに同意します。 –