Listview1 und imglist, wie füge ich das richtige Bild zum Item zu.

Fridulin

Erfahrenes Mitglied
Hallo,

ich weiß nicht wie ich das richtige Bild in einer imglist zum Richten Item (der List View) hinzufügen soll. Ich poste hier mal mein Code der komischer weise bei Zwei Items funktioniert. Allerdings ab den dritten Item zeigt er mal gar nichts mehr an (kein Bild und kein Text), oder mal nur Text, oder alle Items bekommen das gleiche Bild.

il_bilder ist meine Imglist und lv_anwesende ist mein list view.

Code:
	il_bilder.Images.Clear();
	lv_anwesende.Items.Clear();
	int i;
		
     	for (i = 1; i <= (anwesende.Length - 1); i++)
	{
     		
     		if(anwesende[i] != tb_name.Text)
     		{
     			ListViewItem item1 = new ListViewItem(anwesende[i],0); 
     				
     			fuege_bild_hinzu(anwesende[i]);
 			lv_anwesende.Items.AddRange(new ListViewItem[]{item1});
     				
 
      		}
      	}
     	
     	
    	lv_anwesende.SmallImageList = il_bilder;
 	lv_anwesende.LargeImageList = il_bilder;
     	
 					  
 					
      	if(lv_anwesende.Items.Count == 0)
      	{
      		ListViewItem item1 = new ListViewItem("keiner Anwesend");
      		lv_anwesende.Items.AddRange(new ListViewItem[]{item1});
      	}

Code:
void fuege_bild_hinzu (string welches_bild)
{
	//... hier wird die Bilddatei erstellt.... Funktioniert alles gut.
	string dateiname = welches_bild + ".jpg";

	string chatter_bild = Application.StartupPath + "\\" + "Bilder\\" + dateiname;
		
	if (File.Exists(chatter_bild))
	{
			
		try
		{
			il_bilder.Images.Add(Bitmap.FromFile(chatter_bild));		
				
		}
		catch (Exception e)
		{
			MessageBox.Show(e.ToString());
		}
				

				
	}
				
	else
	{
		Assembly b = Assembly.LoadFrom(Application.StartupPath + "\\daten.dll");
		Stream s = b.GetManifestResourceStream("kein_bild.jpg");
		StreamReader sr = new StreamReader(s);
		Image img = 	Image.FromStream(s);
					
		il_bilder.Images.Add(img);
					
	}


}

Über jede Hilfe würde ich mich sehr freuen.

Viele Grüße und einen schönen Abend wünsche ich.
Fridulin


Edit; PS: Schön wäre es wenn man ohne imglist arbeiten könnte. Das man zum Beispiel zum Item Text „xy“ ein Bild von der Bildatei „xy“ hinzufügen kann. Aber das ist ja meines Wissens nicht möglich, oder?
 
Zuletzt bearbeitet:
Du lädst zurzeit für jeden Benutzer ein eigenes Bild aus dem Benutzerbild-Verzeichnis, legst aber bei jedem Eintrag den ImageIndex 0 fest.
Ich würde den Benutzerbildern einen Key zuweisen, sodass man direkt aus der ImageList das entsprechende Bild laden kann.

Die ListViewItems haben leider nur die Möglichkeit ihre Icons aus einer ImageList zu beziehen. Außer du erstellst natürlich eine eigene ListView Komponente bzw. erweiterst die ListView des .net Frameworks so, dass es dies unterstützt.

Hier ein etwas aufgeräumter Code. Hab ihn nicht getestet sollte aber funktionieren.
C#:
 private void refreshUserList()
        {
            try
            {
                // Alte Daten der ListView Löschen
                il_bilder.Images.Clear();
                lv_anwesende.Items.Clear();

                // "Kein Benutzerbild" - Icon laden
                Assembly oDataAssembly = Assembly.LoadFrom(Application.StartupPath + "\\daten.dll");
                Stream oImageStream = oDataAssembly.GetManifestResourceStream("kein_bild.jpg");
                Image oNoIconImage = Image.FromStream(oImageStream);
                il_bilder.Images.Add("noimage", oNoIconImage);
                oImageStream.Close();

                // Keine User online?
                if (anwesende.Length == 0)
                {
                    // Eintrag mit Text anlegen
                    ListViewItem oNoUsersOnlineEntry = new ListViewItem("Keiner Anwesend");
                    lv_anwesende.Items.Add(oNoUsersOnlineEntry);
                }
                else // User Vorhanden
                {
                    string sKey = "noimage";
                    // Alle Anwesenden durchlaufen
                    foreach (string sAnwesender in anwesende)
                    {
                        // Den Eigenen Namen nicht in die Liste hinzufügen
                        if (sAnwesender != tb_name.Text)
                        {
                            // Bild für den User laden
                            // Rückgabe ist der Key für die ImageList
                            sKey = loadUserImage(sAnwesender);

                            // Für Andere User einen Eintrag erstellen
                            ListViewItem oUserEntry = new ListViewItem(sAnwesender, sKey);

                            // Eintrag der Liste hinzufügen
                            lv_anwesende.Items.Add(oUserEntry);
                        }
                    }
                }

                // Die ImageList der ListView zuweisen.
                lv_anwesende.SmallImageList = il_bilder;
                lv_anwesende.LargeImageList = il_bilder;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }

        private string loadUserImage(string sUserName)
        {
            try
            {
                // Dateiname generieren
                string sFileName = sUserName + ".jpg";
                string sFilePath = Application.StartupPath + "\\Bilder\\" + sFileName;

                // Existiert das Benutzerbild?
                if (File.Exists(sFilePath))
                {
                    // Bild laden und Hinzufügen
                    il_bilder.Images.Add(sUserName, Bitmap.FromFile(sFilePath));
                    return sUserName;
                }
                else // Bild Existiert nicht
                {
                    // Das Default-Bild anzeigen
                    return "noimage";
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                // Das Default-Bild anzeigen
                return "noimage";
            }
        }
 
Hallo,

vielen Dank für die Antwort, Hilfe und Mühe.

Ich habe den Code getestet und das Problem ist, wenn ich das Programm 1 mal starte zeigt er mir keine Bilder an. Sobald ich das Programm noch einmal starte Zeigt mir das erste Programm nun mit einmal die Bilder an, aber das Zweite nicht. Genau so, wenn ich noch ein drittes mal das Programm starte, funktionieren die ersten beiden und das dritte zeigt wieder keine Bilder an.

Ein "Fehler ist auch noch (aber ich denke nicht das es daran liegt), ist das der erste string[] anwesende immer „user liste" (also anwesende[0]) ist. Dann zeigt das Programm als Name user liste an. Allerdings erhält der „Benutzer“ dann auch kein Bild, was er ja eigentlich erhalten sollte (auch wenn es jetzt ja kein Benutzer in diesen Sinne ist).
Das mit der user liste ist ja nicht das Problem das bekomme ich schon hin. Aber warum er keine Bilder anzeigt, erst wenn ich das Programm nochmal starte und immer das Letzte trotzdem keine Bilder anzeigt ist schon sehr merkwürdig.

Viele Grüße und eine gute Nacht wünsche ich.
Fridulin

Edit: Sobald ich die Funktion noch einmal ausführe, dann Zeigt auch das letzte Programm die Bilder an. Eine Idee woran es liegen könnte, oder wie ich das Problem lösen kann?

Edit2: So ich habe den Fehler jetzt entdeckt. Man mußte die Image Liste in der Foreach-Schleife bereits der List View zuweisen. Das ist schon irgendwie merkwürdig, finde ich, aber Hauptsache es klappt.

Besten Dank und viele Grüße
Fridulin
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück