トップ回答者
データテーブルにイメージフィールドを設定してGridViewに画像を表示させたいのですが

質問
-
いつもお世話になっております。今日は、データテーブルとGridViewの使い方で教えていただきたいことがあります。
以下のようなコードを書いてみました。
Dim DT as DataTable = New DataTable
With DT.Columns
.Add("項目1", GetType(String))
.Add("項目2", GetType(String))
.Add("ロゴイメージ", GetType(ImageField))
End WithDim dr As DataRow = DT.NewRow
dr(0) = "加工後の項目1データ"dr(1) = "加工後の項目2データ"
Dim imgimg As ImageField = New ImageField
imgimg.DataImageUrlField = "..\img\image.gif
imgimg.DataImageUrlFormatString = "{0}"
dr(2) = imgimg
DT.Rows.Add(dr)
With GridView
.DataSource = DT
.DataBind()
End With画面デザイン時にはGridViewの項目は全く編集せず、データテーブルで様々なデータを編集した後、データテーブルを作成して、その内容をそのままGridViewにバインドして表示させたいと考えております。
画面デザイン時にGridViewの項目をあらかじめ編集しておくとうまくいくのですが、ランタイム時に設定して表示させるという方法がどうもうまくいきません。
この資料を見たり、いろいろ自分なりに調べてみたのですが、どうにも解決策が見つかりませんでした。
いつも、勉強不足だったり、変な質問だったりで大変恐縮ですが、もし、良い方法をご存じの方がいらっしゃいましたら、教えていただけますでしょうか?何卒よろしくお願いします。
回答
-
ImageFieldはGridViewの列です。したがってGridViewで自動生成された列に列を放り込むのはおかしな考えです。もし、その考え方に当てはめるのであれば、データテーブルの他の列も、StringではなくStringFieldになります。もちろん、StringFieldは実際にはありません。
さて、AutoGenerateColumns = True の状況でどのように対処するかを考えてみたのですが、とりあえず以下のテストコードを書いてみました。
コード ブロックDim imageColumnIndex As Integer
Protected Sub cbtn_bind_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cbtn_bind2.Click
Dim DT As DataTable = New DataTableWith DT.Columns
.Add("項目1", GetType(String))
.Add("項目2", GetType(String))
.Add("ロゴイメージ", GetType(String))
End WithDim dr As DataRow = DT.NewRow
dr(0) = "加工後の項目1データ"
dr(1) = "加工後の項目2データ"
dr(2) = "<img src=""./image/hoge.gif"" />"DT.Rows.Add(dr)
imageColumnIndex = 2
With GridView1
.DataSource = DT
.DataBind()
End With
End SubProtected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
e.Row.Cells(imageColumnIndex).Text = Server.HtmlDecode(e.Row.Cells(imageColumnIndex).Text)
End If
End Sub
すべての返信
-
以下のような感じで。
変更した点は、データテーブルのロゴイメージ列はStringで。(イメージのパスを格納します)
またAutoGenerateColumnではイメージフィールドを生成してくれないので、マニュアルで生成します。
そのイメージフィールドのDataImageUrlFieldにデータテーブルのイメージのパスが格納された列を指定します。
コード ブロックDim DT As DataTable = New DataTable
With DT.Columns
.Add("項目1", GetType(String))
.Add("項目2", GetType(String))
.Add("ロゴイメージ", GetType(String))
End WithDim dr As DataRow = DT.NewRow
dr(0) = "加工後の項目1データ"
dr(1) = "加工後の項目2データ"
dr(2) = ResolveUrl(".\img\img.gif")DT.Rows.Add(dr)
With GridView1
Dim f As New System.Web.UI.WebControls.ImageField()
f.DataImageUrlField = "ロゴイメージ"
.Columns.Add(f).DataSource = DT
.DataBind()
End With -
ImageFieldはGridViewの列です。したがってGridViewで自動生成された列に列を放り込むのはおかしな考えです。もし、その考え方に当てはめるのであれば、データテーブルの他の列も、StringではなくStringFieldになります。もちろん、StringFieldは実際にはありません。
さて、AutoGenerateColumns = True の状況でどのように対処するかを考えてみたのですが、とりあえず以下のテストコードを書いてみました。
コード ブロックDim imageColumnIndex As Integer
Protected Sub cbtn_bind_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cbtn_bind2.Click
Dim DT As DataTable = New DataTableWith DT.Columns
.Add("項目1", GetType(String))
.Add("項目2", GetType(String))
.Add("ロゴイメージ", GetType(String))
End WithDim dr As DataRow = DT.NewRow
dr(0) = "加工後の項目1データ"
dr(1) = "加工後の項目2データ"
dr(2) = "<img src=""./image/hoge.gif"" />"DT.Rows.Add(dr)
imageColumnIndex = 2
With GridView1
.DataSource = DT
.DataBind()
End With
End SubProtected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
e.Row.Cells(imageColumnIndex).Text = Server.HtmlDecode(e.Row.Cells(imageColumnIndex).Text)
End If
End Sub