2011-11-18 21 views
11

私はDataGridViewに画像列を持っています。プロパティでは、イメージを設定しようとしています。画像をクリックし、プロジェクトのリソースファイルを選択し、表示された画像の1つを選択します。ただし、イメージはまだDataGridViewに赤いxとして表示されますか?誰も知っている理由は?Datagridview画像列設定画像 - C#

+0

リソースファイルから画像をロードしたい場合.... –

答えて

23

たとえば、2つのテキスト列と1つのイメージ列を持つ 'dataGridView1'という名前のDataGridViewコントロールがあります。また、リソースファイルにimage00とimage01という名前のイメージがあります。

次のように行を追加しているときにあなたが画像を追加することができます。

dataGridView1.Rows.Add("test", "test1", Properties.Resources.image00); 

をあなたのアプリケーションの実行中にも画像を変更することができます。

dataGridView1.Rows[0].Cells[2].Value = Properties.Resources.image01; 

か、このように行うことができますが...

void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
    {    
     if (dataGridView1.Columns[e.ColumnIndex].Name == "StatusImage") 
     { 
      // Your code would go here - below is just the code I used to test 
       e.Value = Image.FromFile(@"C:\Pictures\TestImage.jpg"); 
     } 
    } 
+0

@Darren Youngこれが機能しない場合は、コメントを残してください。このコードをもっと提供します。 –

1

機能はありますが、回答にはかなり重大な問題があります。それはResourcesから直接ロードイメージを示唆:

dgv2.Rows[e.RowIndex].Cells[8].Value = Properties.Resources.OnTime; 

問題は、これが新しいイメージオブジェクトにリソースデザイナーのファイルに見られるように、それぞれの時間を作成することです:

internal static System.Drawing.Bitmap bullet_orange { 
    get { 
     object obj = ResourceManager.GetObject("bullet_orange", resourceCulture); 
     return ((System.Drawing.Bitmap)(obj)); 
    } 
} 

300がある場合(または3000)行に同じステータスを持ち、それぞれに独自のイメージオブジェクトは必要なく、イベントが発生するたびに新しいイメージオブジェクトも必要ありません。第二に、以前に作成された画像は廃棄されていない。そこから割り当て/アレイと使用されるように、このすべて、単に負荷リソースイメージを避けるため

private Image[] StatusImgs; 
... 
StatusImgs = new Image[] { Resources.yes16w, Resources.no16w }; 

そしてCellFormattingイベントに:

if (dgv2.Rows[e.RowIndex].IsNewRow) return; 
if (e.ColumnIndex != 8) return; 

if ((bool)dgv2.Rows[e.RowIndex].Cells["Active"].Value) 
    dgv2.Rows[e.RowIndex].Cells["Status"].Value = StatusImgs[0]; 
else 
    dgv2.Rows[e.RowIndex].Cells["Status"].Value = StatusImgs[1]; 

同じ2つの画像オブジェクトが使用されていますすべての行について

関連する問題