In Windows-Form Anwendungen kommt man öfters in die Verlegenheit, irgendwelche Bilder, Icons oder Logos anzuzeigen. Auch in Tabellen oder in einem DataGridView können kleinen Grafiken die Lesbarkeit stark erhöhen. Die Grafiken der eigentlichen Exe beizulegen mag seine Vorteile haben, doch oftmals ist es besser, diese in der ausführbaren Datei zu inkludieren und aus dem Speicher abzurufen. Wie man eine Datei als Resource in Visual Studio bereitstellt, beschreibe ich hier.
Zuerst muss man zum Resourcen-Fenster navigieren. Ein Weg, dorthin zu gelangen, ist ein Rechtsklick im Projektmappen-Explorer auf die Applikation, dann „Eigenschaften“ wählen. Im sich öffnenden Fenster sieht man nun einige Tab-Reiter. Man wählt hier den Tab Reiter „Ressourcen“. Die Schaltfläche „Ressource hinzufügen“ ist eigentlich selbsterklärend. Man wählt die passende Eigenschaft (oder wählt „vorhandene Datei hinzufügen“), vergibt dem Bild bzw. der Ressource einen eindeutigen Namen. Wenn man eine Datei direkt hinzufügt, sollte man je nach Namenskonvention diesen noch anpassen.
Die Grafik Resource in C# ansprechen
Nun haben wir also eine Grafik als Resource hinzugefügt. Nun möchten wir diese auch im Programmcode verwenden. Dies ist in C# nun sehr einfach, denn wir verwenden die statische Klasse „Properties.Resources“. Diese Klasse gewährt uns Zugriff auf die eingebettete Resource.
Im nachfolgenden Beispiel verwenden wir eine PictureBox um eine Grafik anzuzeigen. Eine Grafik „link.jpg“ habe ich als Resource mit dem Namen „link“ hinzugefügt. Der Zugriff auf die Grafik ist nun per „Properties.Resources.link“ möglich:
/// <summary> /// Wir zeigen eine Grafik in einer PictureBox an /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_Load(object sender, EventArgs e) { //Eingebette Resource: link.jpg. Resourcen-Name: link pictureBox1.Image = Properties.Resources.link; }
In Anlehnung an mein Beispiel im Artikel „C# Images in DataGridView anzeigen” greife ich im untenstehenden Beispiel direkt auf die Resource hinzu und spare mir dem Umweg, das Image erst noch explizit zuzuweisen. Wer nicht den direkten Weg über die Properies.Resource gehen möchte, kann den von Microsoft hier beschriebenen Weg über einen Stream gehen.
DataGridViewImageColumn dgv_pic = new DataGridViewImageColumn(false); DataGridViewColumn dgv_text = new DataGridViewTextBoxColumn(); //Füge die Colums hinzu dataGridView1.Columns.Add(dgv_pic); dataGridView1.Columns.Add(dgv_text); //Hier werden manuell zwei Rows hinzugefügt dataGridView1.Rows.Add(2); dataGridView1[0, 0].Value = Properties.Resources.lampe_rot; // (Image)lampe_rot; dataGridView1[0, 1].Value = Properties.Resources.lampe_gruen; //(Image)lampe_gruen; dataGridView1[1, 0].Value = "Server A"; dataGridView1[1, 1].Value = "Server B";
Vorteil einer eingebettenen Resource
Der größte Vorteil ist natürlich, dass die Ressource, beispielsweise eine Grafik oder ein Icon nach dem Release in der Exe enthalten ist. Man muss sich keine weitere Gedanken mehr über die Grafik machen und man kann sicher sein, dass die Anwendung auch auf das Bild zugreifen kann. Aber auch der Nachteil liegt klar auf der Hand: Jedes so integrierte Bild vergößert die Exe. Es dürfte also wenig Sinn machen, große Images so zu integrieren. Kleine Status-Bilder oder Icon-Sets können aber so elegant integriert werden.