2011-11-18 37 views
11

我有一個DataGridView與圖像列。在屬性中,我試圖設置圖像。我點擊圖像,選擇項目資源文件,然後選擇一個顯示的圖像。但是,該圖像仍然顯示爲DataGridView上的紅色x?任何人都知道爲什麼?Datagridview圖像列設置圖像 - C#

+0

你想從資源文件加載圖像.... –

回答

23

例如,您有包含兩個文本列和一個圖像列的名爲'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楊,你會留下評論,如果這不工作,我會提供更多的代碼.. –

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個圖像對象對於所有的行。