質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

6751閲覧

.NET DataGridViewに画像を表示するとセルが黒くなる。

Com

総合スコア30

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2019/04/04 03:50

DataGridViewに画像データを表示して、DataGridViewをサイズ変更したり
スクロールしたりすると、全体セルの半分以上がランダム範囲でブラックアウトしたような
描画になります。

次のようなDataGridViewを作成しています。

1.まずデータソースです。
DataTable.Columns.Add("image", GetType(System.Drawing.Image));
DataTable.Columns.Add("id", GetType(int));
DataTable.Columns.Add("name", GetType(string));

2.DataGridViewです。
※イメージ列作成
DataGridViewImageColumn _columnImage = new DataGridViewImageColumn();
_columnImage.HeaderText = "絵";
_columnImage.Name = "image";
_columnImage.DataPropertyName = "image";
_columnImage.ImageLayout = DataGridViewImageCellLayout.Zoom;
DataGridView.Columns.Add(_columnImage );
※ID列作成
DataGridViewTextBoxColumn _column = new DataGridViewTextBoxColumn();
_column.HeaderText = "ID";
_column.Name = "id";
_column.DataPropertyName = "id";
DataGridView.Columns.Add(_column);

... IDと同じく名前も追加

3.データ設定します。
DataGridView.DataSource = DataTable

こんな感じで、1列画像の2列テキストの
3列100行程度のデータを登録したDataGridViewを表示しますと
初回は正しく表示されるのですが、その後サイズやスクロールを動かすと
全体セルの半分がくらいが、法則性もなくブラックアウトしたようになってしまいます。

対策として試してみましたことは
■DataGridViewにダブルバッファを設定
■DataGridView_CellPainting イベントで DataGridView.Invalidate(); を実行
と行いましたが、何も変化ありませんでした。

何卒、ご教授よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2019/04/05 00:12

提示されているコードで試したのですが、仰る現象が再現できません。 画像の大きさはどのくらいでしょうか。また、他のイベントの記述など提示コード以外の部分はありますでしょうか。 こちらの環境:Win10、メモリ8G、Intel(R)HDGraphics630、.NET Framework4.7.2
Com

2019/04/05 03:05

ありがとうございます! 私の環境はWin10 Home Visual Studio Express2010 .NET Framework4 でございます。 ご意見いただきました内容を参考に、確かに上記は一部を切り出したものでしたので 切り分けて上記の内容でミニマムのWindowsFormを作成して動かしてみましたが 結果に変化はありませんでした。 試しに別のPCでも確認してみたのですが、結果は同じでした。 画像は148ファイルありまして、8割が2KB~5KB で残り2割が10KB~30KBのサイズになり 種類はJPG、PNG、GIFの混在になります。 DataTableを作成するまでの流れを念のためにお伝えしますと チャットワークというサービスがありまして、これにAPIを投げて自分のチャット相手一覧を JSON形式で取得し、これをJSON.NETで読み取ったデータでDataTableを作成しています。 読取ったデータにはチャット相手の画像ファイルパスがありますので、WebClientでいったん ローカルフォルダに取得して、これをDataTableに入れ、画像、ID、名前に整形して DataGridViewに代入しております。
guest

回答2

0

ベストアンサー

下記コードを
・Windows7、VisualStudio2008、.NET Framework3.5
・Windows10、VisualStudio2017、.NET Framework4
の2つの環境で試してみました。
画像ファイルは約20KByte~約800KByteの10種類のPNG、JPEGファイルをコピーし、ファイル数は100用意しました。

C#

1using System; 2using System.Data; 3using System.Drawing; 4using System.Windows.Forms; 5using System.IO; 6 7namespace WindowsFormsApplication1 8{ 9 public partial class Form1 : Form 10 { 11 12 public Form1() 13 { 14 InitializeComponent(); 15 } 16 17 DataTable dataTable; 18 private void Form1_Load(object sender, EventArgs e) 19 { 20 DataGridView dataGridView1 = new DataGridView(); 21 dataGridView1.Dock = DockStyle.Fill; 22 this.Controls.Add(dataGridView1); 23 24 dataTable = new DataTable(); 25 dataTable.Columns.Add("image", typeof(System.Drawing.Image)); 26 dataTable.Columns.Add("id", typeof(int)); 27 dataTable.Columns.Add("name", typeof(string)); 28 29 DataGridViewImageColumn _columnImage = new DataGridViewImageColumn(); 30 _columnImage.HeaderText = "絵"; 31 _columnImage.Name = "image"; 32 _columnImage.DataPropertyName = "image"; 33 _columnImage.ImageLayout = DataGridViewImageCellLayout.Zoom; 34 dataGridView1.Columns.Add(_columnImage); 35 36 DataGridViewTextBoxColumn _column = new DataGridViewTextBoxColumn(); 37 _column.HeaderText = "ID"; 38 _column.Name = "id"; 39 _column.DataPropertyName = "id"; 40 dataGridView1.Columns.Add(_column); 41 42 43 DataGridViewTextBoxColumn _column2 = new DataGridViewTextBoxColumn(); 44 _column2.HeaderText = "NAME"; 45 _column2.Name = "name"; 46 _column2.DataPropertyName = "name"; 47 dataGridView1.Columns.Add(_column2); 48 49 dataGridView1.DataSource = dataTable; 50 dataGridView1.Columns[0].Width = 300; 51 dataGridView1.RowTemplate.Height = 100; 52 53 string[] files = Directory.GetFiles(@"C:\work\testpic\"); 54 55 for (int i = 0; i < 99; i++) 56 { 57 dataTable.Rows.Add(Image.FromFile(files[i]), i, string.Format("NAME-{0}",i)); 58 } 59 60 } 61 } 62} 63

スクロールバーでスクロールしたり、マウスホイールでスクロールしたりしてみましたが、セルが黒くなるような現象は出ませんでした。

投稿2019/04/05 03:48

YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Com

2019/04/05 03:56

ありがとうございます! ここまで見ていただいて感激しております。 色々切り分けて見ている中で1つわかったのですが、PNGだけ抽出して表示すると 問題なく表示されまして、JPGだけ抽出して表示するとブラックアウトするセルが出てきました。 Windows上では問題なく表示されるJPGファイルでしたが、DataGridViewと相性の悪い JPGってあったりするのでしょうか。。。?
YAmaGNZ

2019/04/05 04:20 編集

もし、画像ファイルのフォーマットによる現象なのだとすれば、画像を取得する際にフォーマットを変換してはどうでしょうか?
Com

2019/04/05 06:20 編集

ありがとうございます!解決しました。 おっしゃる通り、全てのファイルをこんな感じでフォーマット変換して利用しましたら、イケました! System.Drawing.Bitmap _bmp = new System.Drawing.Bitmap(_filePath_JPG); _bmp.Save(_filePath_PNG, System.Drawing.Imaging.ImageFormat.Png); 余談ですが、BMPでフォーマット統一してみたら、全滅しました。。。 私のDataGridViewはPNGのみってこととします。。。(泣)
guest

0

DataGridView の ColumnWidthChanged や Scroll イベントで DataGridView を Refresh() してみてはどうでしょう?

投稿2019/04/04 03:58

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Com

2019/04/04 04:32

ご教授ありがとうございます。 しかしながら、改善できませんでした。。。 ブラックアウト部分のセルをクリックすると、そのセルだけ表示がもとに戻るんですが 何か一括で正しく表示しなおす方法はないものでしょうか。。。
Com

2019/04/04 04:33

あ、画像部分はクリックしても、表示されたりされなかったりします。
Com

2019/04/04 06:01

ありがとうございます! いただいたご意見をもとに、データ量を5件に減らしてみました。 色々いじってみたのですが、データの重さに関係なく画像を表示しようとすると セルが4行目からバグってくる法則性を確認できました。 データ内容に問題があるのかと思いまして、表示内容を変えてみたのですが この法則に変化はありませんでした。 私の画像の扱い方のが悪いのかもしれないですね。。。
hihijiji

2019/04/04 06:38

Forms(GDI+)ではあまり例は多くないですが、グラフィックドライバのバグの可能性もあります。
Com

2019/04/04 23:17

ありがとうございます。 グラフィックドライバというのは、私のPCのグラフィックカードなんかの ドライバのバグということでよいのでしょうか?
hihijiji

2019/04/05 01:58

特定構成のPCのみで発生することが確認できれば、その可能性が高くなります。
Com

2019/04/05 03:16

ありがとうございます。 他のPCで確認してみましたが、同じ現象でありましたー。
Com

2019/04/05 07:22

そういう方法もあるのですね! ありがとうございます。 この方法でもいけるのかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問