- PR -

DataGridViewに画像を表示

1
投稿者投稿内容
chiroru
ベテラン
会議室デビュー日: 2008/10/02
投稿数: 59
投稿日時: 2008-10-02 11:36
言語:Microsoft Visual Studio 2008
データベース:SQL Server 2005 非接続型のデータアクセスです。

現在,上記環境で.netを勉強し始めたところです。
そこでDataGridViewに画像を表示するプログラムを作成したいのですが、うまくいきません。
色々調べたのですが思うようにいかないので,アドバイスをいただければと思います。

<テーブル>
ID  画像
1   C\\aaa.jpg
2   C\\bbb.jpg
3   C\\ccc.jpg

自作したコードは下記の通りです。
ですが、ここでエラーのところで下記のエラーが出てしまいます。
エラー:縮小変換しないで呼び出される、アクセス可能な 'New' がないため、オーバーロードの解決に失敗しました

Dim image As New Bitmap(dgv("画像", e.RowIndex).Value)のdgv("画像", e.RowIndex).Valueを
一度変数に入れるとこのエラーは消えるのですが、何故だかわかりません。

Private Sub frmDataGridViewTest_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  Dim strsql As String
  Call DBConnect() '---DB接続
  '*** DataSet ***
  strsql = "SELECT ID, 画像 FROM テーブル ORDER BY ID"
  Dim comm As SqlCommand = New SqlCommand(strsql, Con)
  Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm)
  dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
  Dim ds As DataSet = New DataSet()
  dataadapter.Fill(ds, "テーブル")
  dgrview.DataSource = ds
  dgrview.DataMember = "テーブル"
  '*** DataGridViewの列に画像を表示する ***
  Dim ImageColumn As New DataGridViewImageColumn()
  ImageColumn.Name = "Image"
  ImageColumn.ValuesAreIcons = False
  ImageColumn.Image = New Bitmap("C\\\\null.gif")
  ImageColumn.ImageLayout = DataGridViewImageCellLayout.Zoom
  ImageColumn.Description = "イメージ"
  dgrview.Columns.Add(ImageColumn)
  Call Disconnect() '---DB切断
End Sub

'//CellFormattingイベントハンドラ
Private Sub dgrview_CellFormatting(ByVal sender As Object, _
                  ByVal e As DataGridViewCellFormattingEventArgs) _
                  Handles dgrview.CellFormatting
  Dim dgv As DataGridView = CType(sender, DataGridView)
  If dgv.Columns(e.ColumnIndex).Name = "Image" AndAlso e.RowIndex >= 0 Then
    Dim image As New Bitmap(dgv("画像", e.RowIndex).Value) ←ここでエラー
    e.Value = image
    e.FormattingApplied = True
  End If
End Sub
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2008-10-02 12:03
引用:

chiroruさんの書き込み (2008-10-02 11:36) より:

ですが、ここでエラーのところで下記のエラーが出てしまいます。
エラー:縮小変換しないで呼び出される、アクセス可能な 'New' がないため、オーバーロードの解決に失敗しました

Dim image As New Bitmap(dgv("画像", e.RowIndex).Value)のdgv("画像", e.RowIndex).Valueを
一度変数に入れるとこのエラーは消えるのですが、何故だかわかりません。


dgv("画像", e.RowIndex).Value が Object 型だからです。
dgv("画像", e.RowIndex) で得られるのは DataGridViewCell 型で、その Value プロパティは Object 型を返します。

DataGridViewCell.Value プロパティ (microsoft.com)

Bitmap クラスのコンストラクタには Object 型を得るものがないので、そのままですとエラーになります。
一度変数に入れるとエラーが消えるのは、暗黙のキャスト(たぶん string 型の変数に入れているのでしょう)によって型が変換されるからです。

Bitmap コンストラクタ (microsoft.com)

dgv("画像", e.RowIndex).Value.ToString とでもすれば動くかもしれません。
でもファイル名を与えると、GC が回収するまでファイルがずっと使用中になったままになると思いますが、それは大丈夫ですか?
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
chiroru
ベテラン
会議室デビュー日: 2008/10/02
投稿数: 59
投稿日時: 2008-10-02 13:12
なるほど。dgv("画像", e.RowIndex) で得られるのは DataGridViewCell 型というのにたどりついていませんでした。
結果として、
dgv("画像", e.RowIndex).Value.ToString と変更するとことでうまくいきました。
ですが、
>でもファイル名を与えると、GC が回収するまでファイルがずっと使用中になったまま>になると思いますが、それは大丈夫ですか?
についてはどうすれば解決できるでしょうか?
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-10-02 14:29
引用:

chiroruさんの書き込み (2008-10-02 13:12) より:

>でもファイル名を与えると、GC が回収するまでファイルがずっと使用中になったまま>になると思いますが、それは大丈夫ですか?
についてはどうすれば解決できるでしょうか?



こちらが参考になると思います。
http://jeanne.wankuma.com/tips/vb.net/image/picturebox.html

サンプルはPictureBox.Imageプロパティへ設定していますが、かわりに e.Value へ設定してあげればよいでしょう。
chiroru
ベテラン
会議室デビュー日: 2008/10/02
投稿数: 59
投稿日時: 2008-10-02 14:44
ありがとうございました。
解決できました。
1

スキルアップ/キャリアアップ(JOB@IT)