- PR -

http://**.jpg など、URLから画像を取得し、データテーブルに格納してDataGridViewに表示したい

投稿者投稿内容
js
常連さん
会議室デビュー日: 2004/09/14
投稿数: 47
投稿日時: 2007-04-03 08:51
こんにちは。

開発環境
VisualC#Express
Windows2000

DataTableと連結したDataGridViewに画像を表示したいと思います。
非連結列の場合は以下のようにして表示することができたのですが、連結した列から画像を表示する方法がよくわかりません。

※非連結列の場合

for (int i=0; i<dataGridView1.Rows.Count; i++){
using (System.Net.WebClient wc = new System.Net.WebClient())
{
//画像の生成
System.IO.Stream st = wc.OpenRead(dataGridView1[0, i].Value.ToString());
Bitmap bmp = new Bitmap(st);
st.Close();
//画像を追加
dataGridView1[0, i].Value = bmp;
}
}

DataTableにはimgurlという項目があってそこに画像パス(URL)を保存しています。
(http://www.hoge.com/image.jpg など)

そこで、DataTableにByte型の項目imgを追加して、上のプログラムのように画像を生成し追加しようとしたのですが、こちらはbmpがバイト配列でないためエラーになります。

foreach(DataRow r in dt.Rows)
{
//URLからビットマップを生成する処理
bmp = 〜;
r["img"] = bmp;
}

非連結だとソートを実行した時の処理など付け加えなくてはいけなくなるので、できれば連結列で画像を表示したいと思っております。
何か良い方法はないでしょうか?
よろしくお願いいたします。





Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-04-03 09:16
ファイル全体をバイト配列に格納しそれを使用すればいいでしょう。
js
常連さん
会議室デビュー日: 2004/09/14
投稿数: 47
投稿日時: 2007-04-03 09:37
Hongliang様
おっしゃる通り私もそれを思いついたのですが、ファイルをバイト配列に格納する方法がよく分かりません。ディスクに保存してあるファイルをバイト配列に読込む方法はMSDNを参考にすると次のようにして行うことができました。

System.IO.FileStream fs = new System.IO.FileStream(@"C:\\hoge.jpg",System.IO.FileMode.Open,System.IO.FileAccess.Read);
//★ファイルを読み込むバイト型配列を作成する
byte[] by = new byte[fs.Length];
fs.Read(by, 0, bs.Length);
fs.Close();

一旦ファイルに落とせばできるのですが、1度に50件表示したいと思っていますのでできたらファイルに落とさず処理したいと思っております。
bmpをそのままバイト配列に格納する方法はありますでしょうか?
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-04-03 10:17
URL とおっしゃってるから、初めにあるのは Image オブジェクトではなく(ネットワーク上かローカル上かはさておき)ファイルかと思ったのですが……。
初めから Image オブジェクトがあるなら、MemoryStream に対して Save すればいいでしょう。

って、始めの投稿を見る限りネットワークにあるみたいですね。
WebClient 使うなら DownloadData でファイル全体を byte[] として取得できますよ。
js
常連さん
会議室デビュー日: 2004/09/14
投稿数: 47
投稿日時: 2007-04-03 11:04
って、始めの投稿を見る限りネットワークにあるみたいですね。
WebClient 使うなら DownloadData でファイル全体を byte[] として取得できますよ。

Hongliang様

説明が悪くて申し訳ありません。はい、インターネット上にある画像の一覧をDataGridViewに表示したいと思っていますので、ネットワークパスのみ取得できるような状態です。

また、.NET1.1の時はDataTableのデータ型に「Base64」というのがあってバイト配列をBase64文字列にコンバートすると列に格納できて、クリスタルレポートなどでも何も意識せず表示することができていたのですが、.NET2.0ではBase64型がありませんが、Byte列型を代用すればよいのでしょうか?

となるとbyte[] を byte に変換するにはどのようにすれば可能でしょうか?
聞いてばかりで申し訳ありません。。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-04-03 12:18
引用:

また、.NET1.1の時はDataTableのデータ型に「Base64」というのがあってバイト配列をBase64文字列にコンバートすると列に格納できて、クリスタルレポートなどでも何も意識せず表示することができていたのですが、.NET2.0ではBase64型がありませんが、Byte列型を代用すればよいのでしょうか?


クリスタルレポートと DataGridView はまったく別の製品(のコンポーネント)ですから、データソースに使用する画像データ形式が違っていても何の不思議も無いでしょう。
なお、.NET の DataTable には今も昔も Base64 型なんてのはありません。String 型だけです。もちろん、Base64 は文字列ですから String 型の列に格納することは当然可能ですが。
// あ、ひょっとしてクリスタルレポート側になんかあったのかな?

引用:

となるとbyte[] を byte に変換するにはどのようにすれば可能でしょうか?


えーと、byte の配列が byte[] ですが。
なにがご不明でしょうか?

[ メッセージ編集済み 編集者: Hongliang 編集日時 2007-04-03 12:20 ]
js
常連さん
会議室デビュー日: 2004/09/14
投稿数: 47
投稿日時: 2007-04-03 12:52
クリスタルレポートと DataGridView はまったく別の製品(のコンポーネント)ですから、データソースに使用する画像データ形式が違っていても何の不思議も無いでしょう。
なお、.NET の DataTable には今も昔も Base64 型なんてのはありません。String 型だけです。もちろん、Base64 は文字列ですから String 型の列に格納することは当然可能ですが。
// あ、ひょっとしてクリスタルレポート側になんかあったのかな?

すみません、正式には「base64Binary」でした。
データテーブルデザイナ?のような物で新しいelementを追加するとデータ型として指定できました。pdfファイルをデータベースに保存したり、ファイルに読込む際にこの型を指定しておりました。

えーと、byte の配列が byte[] ですが。
なにがご不明でしょうか?

これも上記の場合と関係してくるのですが、「base64Binary」を指定しておけばバイト配列を
dt.Rows[0][0] = バイト配列 としておけばよかったのですが

C#Expressのデータテーブルを編集する際には「base64Binary」が無くなってSystem.Byteしか指定できなくて、配列を入れようとするとエラーになってしまいます。

js
常連さん
会議室デビュー日: 2004/09/14
投稿数: 47
投稿日時: 2007-04-03 13:11
Hongliang 様

解決しました(>_<。)

データ型の一覧にbyte[]は出てこないけど自分でて入力で System.Byte[] と入力すると画像が表示されました。

色々お手数お掛けしました。
有難うございました。

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