2011-11-18 12 views
11

Mam DataGridView z kolumną obrazu. We właściwościach próbuję ustawić obraz. Klikam na zdjęcie, wybieram plik zasobu projektu, a następnie wybieram jeden z wyświetlanych obrazów. Jednak obraz nadal wyświetla się jako czerwony x w DataGridView? Ktoś wie dlaczego?Obraz kolumny obrazu Datagridview - C#

+0

chcesz załadować obraz z pliku zasobów .... –

Odpowiedz

23

Na przykład masz formant DataGridView o nazwie "dataGridView1" z dwie kolumny tekstu i jedną kolumnę obrazu. Masz również obrazy w pliku zasobów o nazwie "image00" i "image01".

Możesz dodać obrazy podczas dodawania wierszy tak:

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

Można również zmienić obraz w czasie, gdy aplikacja jest uruchomiona:

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

czy można zrobić tak ...

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 czy ty pls zostaw komentarz, jeśli to nie działa, a ja dostarczy więcej kodu dla tego .. –

1

Chociaż funkcjonalny, istnieje dość istotny problem z przedstawioną odpowiedzią. To sugeruje, ładowanie zdjęć bezpośrednio z Resources:

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

Problemem jest to, że tworzy to nowy obraz przedmiotu za każdym razem, jak można zobaczyć w pliku projektanta zasobów:

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

Jeśli istnieją 300 (lub 3000) wierszy o tym samym statusie, każdy nie potrzebuje własnego obiektu obrazu, ani nie potrzebuje nowego za każdym razem, gdy zdarzenie zostanie wywołane. Po drugie, wcześniej utworzone obrazy nie są usuwane.

Aby uniknąć tego wszystkiego, po prostu załadować obrazy zasobów do tablicy i zastosowania/przypisać stamtąd:

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

następnie w razie 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]; 

Te same 2 obiekty graficzne są wykorzystywane dla wszystkich rzędów.

Powiązane problemy