C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: DataGridViewでのIcon表示


(過去ログ 117 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■68782 / inTopicNo.1)  DataGridViewでのIcon表示
  
□投稿者/ Pla (1回)-(2013/11/15(Fri) 11:24:38)

分類:[.NET 全般] 

-----
Windows 7 64Bit
VisualBasic 2008 Express
-----

お世話になります。
現在、DataTable内のデータから条件判断し、
DataGridViewにImageListに設定したアイコン(.ico形式)を表示させるプログラムを作成しております。
いくつかのサイトのサンプルコードを参考に、コードを記述しましたが、上手く動作しません。
以下のコードのおかしい箇所をご指摘頂けると幸いです。
なお、
・DtはDataTableです。
・ImageListにはIconが4つ登録済みです。
・Exist(Bool型)の値は、DataTableの別のカラムから取得しております。(Trueの値が取れていることは確認済み)
・DataGridViewにDataTableのデータは表示されるのですが、ImageカラムにIconが表示されません。(空欄の状態)

以下、コードです。

        Dim ImageColumn As New DataGridViewImageColumn
        ImageColumn.Name = "Image"
        ImageColumn.DefaultCellStyle.NullValue = Nothing    'セルスタイルのNullValueをnullにする
        ImageColumn.ValuesAreIcons = True                   'Icon型=True / Image型=False
        ImageColumn.ImageLayout = DataGridViewImageCellLayout.Zoom  'イメージを縦横比を維持し拡大/縮小表示する
        DataGridView.Columns.Add(ImageColumn)

        For I As Integer = 0 To DtBom.Rows.Count - 1
                If Exist = True Then
                    Dim Icon As Icon
                    Icon = System.Drawing.Icon.FromHandle(New Bitmap(ImageList.Images(0)).GetHicon)
                    DataGridView.Rows(I).Cells("Image").Value = ImageList.Images(0)
                    'DgvBom("Image", I).Value = ImageList.Images(0)
                End If
        Next

        '表示
        Me.DataGridView.DataSource = Dt

以上、よろしくお願い致します。

引用返信 編集キー/
■68784 / inTopicNo.2)  Re[1]: DataGridViewでのIcon表示
□投稿者/ Hongliang (121回)-(2013/11/15(Fri) 12:01:15)
最後にDataSourceを設定してしまうと、それまでの各行への設定は破棄されて改めて各行がDataSourceから生成されてしまうでしょう。
DataGridViewのRowに追加するのではなく、DataTableにアイコン列を追加して各行にIconを設定し、その列をDataGridViewImageColumn.DataPropertyNameでDataGridViewに表示させるようにしてはいかがでしょうか。

あと、ImageListクラスはコモンコントロールで扱う都合上用意されてるクラスなので、特に必要がないならList(Of Icon)とかを使ったほうがいいです。
引用返信 編集キー/
■68787 / inTopicNo.3)  Re[2]: DataGridViewでのIcon表示
□投稿者/ Pla (2回)-(2013/11/15(Fri) 14:21:58)
Hongliang さん

返信有難うございます。

> DataGridViewのRowに追加するのではなく、DataTableにアイコン列を追加して各行にIconを設定し、その列をDataGridViewImageColumn.DataPropertyNameでDataGridViewに表示させるようにしてはいかがでしょうか。
アドバイス頂いたように、DataTableにIconを設定することで、Iconイメージを表示することが出来ました。

        Dt.Columns.Add("Image", GetType(System.Drawing.Image))
        For I As Integer = 0 To DtBom.Count - 1
            Exist = System.IO.File.Exists(FilePath(I))
            If Exist = True Then
                DtBom.Rows(I)("Image") = ImageList.Images(0)
            End If
        Next

しかし、条件としてIconが設定されないセルに、赤い[X]が表示されてしまいます。
DataGridViewでは
Column.DefaultCellStyle.NullValue = Nothing
にて、[X]を非表示にできましたが、DataTableでも同様の設定はあるのでしょうか?(探したのですが見当たりません...)
もしくは、透明なIconを作成し、表示させる方法が手っ取り早いのでしょうか?
追加で申し訳ありませんが、アドバイス願います。

> あと、ImageListクラスはコモンコントロールで扱う都合上用意されてるクラスなので、特に必要がないならList(Of Icon)とかを使ったほうがいいです。
上記につきまして、ひとまずImageListを使った方法で動作確認出来ましたが、List(Of T)の勉強も兼ねて試作してみたいと思います。

引用返信 編集キー/
■68789 / inTopicNo.4)  Re[3]: DataGridViewでのIcon表示
□投稿者/ Hongliang (123回)-(2013/11/15(Fri) 15:19:30)
> しかし、条件としてIconが設定されないセルに、赤い[X]が表示されてしまいます。
> DataGridViewでは
> Column.DefaultCellStyle.NullValue = Nothing
> にて、[X]を非表示にできましたが、DataTableでも同様の設定はあるのでしょうか?(探したのですが見当たりません...)

DataTableはデータの入れ物であり、何をどう表示するかは関知しません。
表示はDataGridViewの仕事です。

私の環境ではDefaultCellStyle.NullValue=Nothingで表示させないようにできました。
ひょっとして、「Iconが設定されないセル」ではなく、新規行、つまり一番下の未入力行の話ではありませんか?
こちらであれば確かにx画像が表示されます。
この問題については、
http://www.bing.com/search?q=datagridviewimagecolumn+new-row
こんな感じで検索してみるといくつか解決法が見つかりますが、個人的に分かりやすいのは、
DataGridViewImageCellの派生クラスを作る
→DefaultNewRowValueプロパティをオーバーライドしてNothingを返すようにする
→DataGridViewImageColumnのCellTemplateプロパティに上記クラスをNewして設定する
というやり方ですね。
引用返信 編集キー/
■68790 / inTopicNo.5)  Re[4]: DataGridViewでのIcon表示
□投稿者/ Pla (4回)-(2013/11/15(Fri) 17:18:58)
Hongliang さん

返信有難うございます。

> 私の環境ではDefaultCellStyle.NullValue=Nothingで表示させないようにできました。
> ひょっとして、「Iconが設定されないセル」ではなく、新規行、つまり一番下の未入力行の話ではありませんか?
> こちらであれば確かにx画像が表示されます。
> この問題については、
> http://www.bing.com/search?q=datagridviewimagecolumn+new-row
> こんな感じで検索してみるといくつか解決法が見つかりますが、個人的に分かりやすいのは、
> DataGridViewImageCellの派生クラスを作る
> →DefaultNewRowValueプロパティをオーバーライドしてNothingを返すようにする
> →DataGridViewImageColumnのCellTemplateプロパティに上記クラスをNewして設定する
> というやり方ですね。

なるほど、表示側での対応になるのですね!
ご教示頂いた内容を参考に、コードを仕上げて行きたいと思います。
また、躓いた際にはアドバイス頂けると幸いです。

本当にありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -