C# Images in DataGridView anzeigen

Der Wunsch, ein Image (Bild) in einem DataGridView in C# anzuzeigen, ist nicht vielfältig. Von kleinen Icons oder einer Statusanzeige, Thumbnails bis hin zur tabellarischen Anzeige von Bildern in einer Bildersammlung. Allen Anwendungsarten gemein ist, selten das gleiche Image in jeder Spalte angezeigt werden soll. Wer sich mit einem Image (und immer dem gleichen) in einer Spalte begnügt, kann das Image per Eigenschaft in Visual Studio hinzufügen, oder wie unten dynamisch anzeigen

//Ein Image einem DataGridView hinzufügen (jeder Zeile das gleiche Image)
Image myimage = new Bitmap("c:\mein_image.jpg");
DataGridViewImageColumn dgv_pic = new DataGridViewImageColumn(false);
dgv_pic.ImageLayout = DataGridViewImageCellLayout.Normal;
dgv_pic.Image = myimage;
dataGridView1.Columns.Add(dgv_pic);

Unterschiedliche Images aus einer Resource kann man wie im folgenden Beispiel anzeigen. Dieser Code hat den Nachteil, dass es nur Sinn macht, wenige verschiedene Images anzuzeigen. Hier wird eine Statuslampe (rot/grün) angezeigt:

//Lade die Images aus Resource
Image lampe_rot = Resource1.lampe_rot;
Image lampe_gruen = Resource1.lampe_gruen;

DataGridView dgv = new DataGridView();
DataGridViewImageColumn dgv_pic = new DataGridViewImageColumn(false);
DataGridViewColumn dgv_text = new DataGridViewTextBoxColumn();

//Füge die Colums hinzu
dgv.Columns.Add(dgv_pic);
dgv.Columns.Add(dgv_text);

//Hier warden manuell zwei Rows hinzugefügt
dgv.Rows.Add(2);

dgv[0, 0].Value = (Image)lampe_gruen;
dgv[0, 1].Value = (Image)lampe_rot;
dgv[1, 0].Value = "Server A";
dgv[1, 1].Value = "Server B";

Wenn ein DataGridView an eine Quelle gebunden ist (bindingSource), wird man einen anderen Weg einschlagen müssen. Dies gilt auch für den Fall, dass in jeder Zeile ein eigenes Bild angezeigt werden soll:

//dataGridView1 ist vorhanden und mit Daten gebunden
//Erstelle die Image-Spalte
DataGridViewImageColumn dgvic = new DataGridViewImageColumn(false);
dataGridView1.Columns.Add(dgvic);
               

//Gehe die Rows durch
for (int row = 0; row < dataGridView1.RowCount; row++)
{
//Lokales laden des Images
Image webImage = new Bitmap("c:\my_image.jpg");

//Image in DataGrid einfügen
      dataGridView1.Rows[row].Cells[0].Value = webImage;
//Höhe der Spalte an Image anpassen
      dataGridView1.Rows[row].Height = webImage.Height;
}

Wir gehen also jede Zeile durch und laden in diesem Beispiel jeder Zeile das Image „my_image.jpg“ hinzu. Wenn der Dateiname in der Zeile bekannt ist, kann dieser Aufruf natürlich (und sinnvollerweise) dynamisch erfolgen.

Image per http (webResponse) in DataGridView anzeigen
Oftmals haben wir in unserem dataGridView eine URL zur einem Image, das wir als Thumbnail (Vorschaubild) in unserer Tabelle anzeigen möchten. Dann können wir das Image nicht per Image webImage = new Bitmap() laden, sondern müssen es per WebRequest anfordern. Hierzu benötigen wir „using System.Net”.
Wir nutzen den gleichen Code wie im Beispiel oben, ersetzen jedoch „Image webImage“ („Lokales laden des Images“) mit folgendem Code:

//Laden des Images per http
//using System.Net;
string picUri = "http://domain.de/images/my_image.gif";
WebRequest requestPic = WebRequest.Create(picUri);
WebResponse responsePic = requestPic.GetResponse();

/Wandel den http-Stream zu Image
Image webImage = Image.FromStream(responsePic.GetResponseStream());

Zu beachten gilt, dass der Zugriff per WebRequest hinter einem Proxy (in Firmen sicherlich Standard) so nicht funktioniert. Der folgende Code zeigt einen Request über einen WebProxy:

WebRequest request = WebRequest.Create(sURL);
WebProxy proxy = new WebProxy(sWebProxy, Convert.ToInt32(sPort));
//            proxy.UseDefaultCredentials = true;
proxy.Credentials = new NetworkCredential(sUser, sPasswort, sDomain);
request.Proxy = proxy;
WebResponse response = request.GetResponse();

Schreibe einen Kommentar