DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridViewImageColumnについて

環境/言語:[C# .NET Framework 2.0]
分類:[.NET]

お世話になっております。

DataGridViewImageColumn を使用して数種類の画像を表示しています。
SortMode を Automatic にしているのですが、ヘッダーをクリック
してもソートがかかりません。

解決策がありましたら、ご教授お願いします。
DataGridViewの行の並び替えの方法を変更する
http://dobon.net/vb/dotnet/datagridview/customsort.html

DataGridViewの行が自動的に並び替えられるようにする
http://dobon.net/vb/dotnet/datagridview/autosort.html

これらはご覧になったでしょうか?
ご回答ありがとうございました。
拝見させていただきました。

SortMode を Programmatic に変更して
dataGridView.Sort(dataGridView.Columns["Column1"], ListSortDirection.Ascending);
としてみましたが並び替えは行われませんでした。
DataGridViewImageColumn には適用されないように思います。


■No21326に返信(管理人さんの記事)
> DataGridViewの行の並び替えの方法を変更する
> http://dobon.net/vb/dotnet/datagridview/customsort.html
>
> DataGridViewの行が自動的に並び替えられるようにする
> http://dobon.net/vb/dotnet/datagridview/autosort.html
>
> これらはご覧になったでしょうか?
> 拝見させていただきました。
>
> SortMode を Programmatic に変更して
> dataGridView.Sort(dataGridView.Columns["Column1"], ListSortDirection.Ascending);
> としてみましたが並び替えは行われませんでした。
> DataGridViewImageColumn には適用されないように思います。

「DataGridViewの行の並び替えの方法を変更する」ではただDataGridView.Sortを呼び出すだけの方法は紹介していませんが、ここで紹介している全ての方法を試されたのでしょうか?
> 「DataGridViewの行の並び替えの方法を変更する」ではただDataGridView.Sortを呼び出すだけの方法は紹介していませんが、ここで紹介している全ての方法を試されたのでしょうか?

DataGridView.Sortメソッドを使用する方法とSortCompareイベントを使用する方法
はセルのデータがIconなので無理でした。
DataView.Sortプロパティを使用する方法はDataGridViewのDataSourceプロパティにデータソースが設定していないのでやっていません。
そもそも画像を昇順に並び替えるということが変なのでしょうか。
> そもそも画像を昇順に並び替えるということが変なのでしょうか。

もしIconオブジェクトを並び替えるための方法を定義できるのであれば、可能でしょう。

正直なところ、どのように並び替えたいのかが分かりません。もしセルの値によって表示する画像を変えており、その値で並べ替えをしたいという場合は、列にはDataGridViewTextBoxColumnなどを使い、画像をCellPaintingイベントで描画するといった方法もあります。
とりあえず、ダミーでDataGridViewTextBoxColumn(非表示)を新たに追加してキーを入れることにしました。ソートの際は新たに追加した列をソートするようにしました。

ちなみに、DataGridViewTextBoxColumnにCellPaintingイベントを使用して画像の表示はできるのですが、設定した文字列も表示されてしまいます。文字列を表示しない方法はありますでしょうか。
> ちなみに、DataGridViewTextBoxColumnにCellPaintingイベントを使用して画像の表示はできるのですが、設定した文字列も表示されてしまいます。文字列を表示しない方法はありますでしょうか。

編集状態になると表示されるということでしょうか?それとも、そうでなくても表示されてしまいますか?

CellPaintingイベントについては、

DataGridViewのセルを自分で描画する
http://dobon.net/vb/dotnet/datagridview/ownerdrawcell.html

をご覧ください。
ご回答ありがとうございます。

> 編集状態になると表示されるということでしょうか?それとも、そうでなくても表示されてしまいますか?

DataGridViewは読み取り専用にしていますので、編集状態でなくても表示されています。
> DataGridViewは読み取り専用にしていますので、編集状態でなくても表示されています。

普通は、そのようなことはありません。CellPaintingイベントハンドラにどのようなコードを記述しているのか教えていただけませんか?
> 普通は、そのようなことはありません。CellPaintingイベントハンドラにどのようなコードを記述しているのか教えていただけませんか?

http://dobon.net/vb/dotnet/datagridview/ownerdrawcell.html
の「セルの背景に画像を表示する」のコードを使いました。
> http://dobon.net/vb/dotnet/datagridview/ownerdrawcell.html
> の「セルの背景に画像を表示する」のコードを使いました。

この例では、DataGridViewCellPaintingEventArgs.Paintメソッドで背景以外を全て描画していますので、そのままでは前景も表示されます。前景が表示されないようにしてPaintメソッドを呼び出すか、画像以外全く描画する必要がなければPaintメソッドを呼び出す必要はありません。
> この例では、DataGridViewCellPaintingEventArgs.Paintメソッドで背景以外を全て描画していますので、そのままでは前景も表示されます。前景が表示されないようにしてPaintメソッドを呼び出すか、画像以外全く描画する必要がなければPaintメソッドを呼び出す必要はありません。

Icon icon = new Icon(〜);
e.PaintBackground(e.ClipBounds, true);
int x = e.CellBounds.X + (e.CellBounds.Width - icon.Width) / 2;
int y = e.CellBounds.Y + (e.CellBounds.Height - icon.Height) / 2;
e.Graphics.DrawIcon(icon, x, y);
e.Handled = true;

で解決しました。
いろいろとアドバイスありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板