2011-11-18 35 views
11

Tôi có một DataGridView với một cột hình ảnh. Trong các thuộc tính, tôi đang cố gắng thiết lập hình ảnh. Tôi nhấp vào hình ảnh, chọn tệp tài nguyên dự án, sau đó chọn một trong các hình ảnh được hiển thị. Tuy nhiên, hình ảnh vẫn hiển thị dưới dạng x màu đỏ trên DataGridView? Ai biết tại sao?Datagridview Hình ảnh Thiết lập Hình ảnh Cột - C#

+0

bạn muốn tải hình ảnh từ tệp tài nguyên .... –

Trả lời

23

Ví dụ: bạn có điều khiển DataGridView có tên 'dataGridView1' với hai cột văn bản và một cột hình ảnh. Bạn cũng có một hình ảnh trong tệp tài nguyên có tên 'image00' và 'image01'.

Bạn có thể thêm hình ảnh trong khi thêm dòng như thế này:

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

Bạn cũng có thể thay đổi hình ảnh khi ứng dụng của bạn đang chạy:

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

hoặc bạn có thể làm như thế này ...

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 bạn sẽ để lại nhận xét nếu điều này không hoạt động và tôi sẽ cung cấp thêm mã cho điều này .. –

1

Trong khi chức năng, có một vấn đề khá quan trọng với câu trả lời được trình bày. Nó gợi ý tải hình ảnh trực tiếp từ Resources:

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

Vấn đề là rằng điều này tạo ra một đối tượng hình ảnh mới mỗi lần như có thể thấy trong file thiết kế nguồn:

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

Nếu có 300 (hoặc 3000) hàng có cùng trạng thái đó, mỗi hàng không cần đối tượng hình ảnh riêng của nó, cũng không cần một đối tượng mới mỗi khi sự kiện xảy ra. Thứ hai, hình ảnh được tạo trước đó không được xử lý.

Để tránh tất cả điều này, chỉ cần tải hình ảnh tài nguyên vào một mảng và sử dụng/gán từ đó:

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

Sau đó, trong CellFormatting sự kiện:

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]; 

Cùng 2 đối tượng hình ảnh được sử dụng cho tất cả các hàng.

Các vấn đề liên quan