2012-03-26 4 views
0

DataGridViewがあり、DataTablesを使用してDataGridViewのDataSourceを設定しました。c#windowフォームDataTable with Image列並べ替え

DataTable dt = new DataTable(); 

     dt.Columns.Add("Image",typeof(Bitmap)); 
     dt.Columns.Add("Col2", typeof(string)); 
     dt.Columns.Add("Col3", typeof(string)); 
     dt.Columns.Add("Col4", typeof(string)); 
     dt.Columns.Add("Col5", typeof(string)); 

     int currentrow = 0; 
     foreach (Dev d in Devs) 
     { 
      dt.Rows.Add(dt.NewRow()); 
      Bitmap bmp = Test(d); 
      dt.Rows[currentrow][0] = bmp; 
      dt.Rows[currentrow][1] = d .ID; 
      dt.Rows[currentrow][2] = d .Name; 
      dt.Rows[currentrow][3] = d .Country; 
      dt.Rows[currentrow][4] = d .State; 
      currentrow++; 
     } 
     datagridview.DataSource = dt; 

このコードでは、列の文字列型を並べ替えることはできますが、画像に基づいて並べ替えることもできます。私は画像の列をクリックしたいと画像に基づいてソートする必要があります。 3種類の画像しかないので、簡単に表示できるように同じ画像をまとめておきます。 私が検索したところ、まだ解決策が見つかりませんでした。 私は正しい方向に導くことができるものは何ですか?私はこの

datagridview.Sort(dgvFusePTW.Columns[0], ListSortDirection.Ascending); 

エラーのような何かをしようとしました

ガットのエラー:データバインドDataGridViewコントロールは、データのみバインド列でソートすることができます。

更新: もう1列追加しました。それは隠されて、イメージの列(1番目)をクリックすると、ColumnHeaderMouseClickイベントが発生します。ロジックを追加して隠れた列を並べ替えました。 誰かが私をクリックしただけで回避できます。

答えて

1

これを行うには、DataViewを使用する必要があります。 (あなたは、LINQを活用するDataSetExtensionsを使用する必要があります。)また、次の静的な拡張メソッドを定義する必要があり

// the Bitmap class has the RawFormat property that tells whether 
// it's JPG, PNG, BMP, etc etc 
DataView dv = dt.AsEnumerable() 
    .OrderBy(c => c.Field<Bitmap>("Image").GetImageOrder()) // sort by image type 
    .ThenBy(d => d.Field<string>("Col2")) // then sort by ID... 
    .AsDataView(); 

// take the dataview and bind... 
datagridview.DataSource = dv; 

supportedFormats配列があること、任意のソート順序を持っていることを

public static class ImageHelper 
{ 
    private static ImageFormat[] supportedFormats = new ImageFormat[] 
    { 
     ImageFormat.Bmp, 
     ImageFormat.Gif, 
     ImageFormat.Jpeg, 
     ImageFormat.Png, 
     ImageFormat.Tiff, 
     ImageFormat.Wmf, 
     ImageFormat.Emf, 
     ImageFormat.Exif 
    }; 

    public static int GetImageOrder(this Image target) 
    { 
     for (int i = 0; i < supportedFormats.Length; i++) 
     { 
      if (target.RawFormat.Equals(supportedFormats[i])) 
      { 
       return i; 
      } 
     } 

     // the image format is not within our supported formats array: 
     // just order it to the very end 
     return 9999; 
    } 
} 

注意をIちょうど思いついた - あなたが望むように配列を並べ替えることができますし、イメージは並べ替えることができます。

+0

画像のみに基づいています。画像のタイプではありません。そのため、1つのタイプの画像しかありません。 .ICO。更新された質問。 –

+0

私はあなたのソリューションを試しましたが、 "System.ArgumentException:少なくとも1つのオブジェクトがIComparableを実装する必要があります"のようなエラーが表示されます。 –

+0

@ L.E、私は答えを更新しました、これは今すぐ動作するはずです。 – code4life

関連する問題