Laden...

ListView bzw. ImageList zur Laufzeit leeren?

Erstellt von Pacher vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.276 Views
P
Pacher Themenstarter:in
18 Beiträge seit 2015
vor 9 Jahren
ListView bzw. ImageList zur Laufzeit leeren?

Hallo!
Bevor ich mir noch die Stirn mit meinem Problem blutig schlage, hoffe ich hier den entscheidenden Tipp oder Lösung zu erhalten.
Lade mir in einer Listview hauptsächlich Picture-Files und hole mir per SHGetFileInfo-Funktion das jeweilige File-Symbol mit Hilfe einer ImageList - das funktioniert auch tadellos.
Aaaber, würde gerne zur Laufzeit die Möglichkeit haben, die ListView entweder MIT oder OHNE die Symbole umzuschalten. Sollte eigentlich ganz einfach sein, ListView leeren und entsprechend neu zu füllen.
Funktioniert auch wie gewünscht, wenn ich beim Start der Anwendung die ListView OHNE Symbole lade und dann während der Laufzeit dies neu und MIT Symbolen fülle, aber leider dann nicht mehr umgekehrt, also OHNE Symbole. Es wird zwar das Symbol nicht mehr angezeigt, es wird aber der Dateiname nicht mehr linksbündig gesetzt.
Für mich hat es den Anschein, dass die ImageList nicht vollständig geleert, gelöscht oder entfernt wird. Habe schon alle „mir“ bekannten Möglichkeiten probiert, nichts hilft, erst wieder ein Neustart.
Habe versucht dies in einem minimal-Programm (siehe Code), dies zu verdeutlichen. Wie gesagt, Problempunkt ist in Schritt 3 – siehe auch meine ausdokumentierten, vergeblichen Versuche.
Bin eher Beginner, vielleicht liegt es auch an der SHGetFileInfo-Funktion?? Wäre um jede Hilfe wirklich dankbar!
Sorry auch für den Roman, nur wie erklär ich sowas halbwegs verständlich…!

//.................	
		// Schritt 1. (kein Problem)
		void MainFormLoad(object sender, EventArgs e)
		{
            string strFileName = @"C:\Info.ico";
			listView1.View = View.Details;
		    listView1.Items.Add(strFileName);
		}
		
		//Schritt 2. (kein Problem)
		void Button1Click(object sender, EventArgs e)
		{
            string strFileName = @"C:\Info.ico";
            IntPtr hImgSmall;
            SHFILEINFO shinfo = new SHFILEINFO();            
            listView1.SmallImageList = imageList1;
            hImgSmall = Win32.SHGetFileInfo(strFileName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_SMALLICON);
            Icon myIcon = (Icon)Icon.FromHandle(shinfo.hIcon).Clone(); 
            Win32.DestroyIcon(shinfo.hIcon);

            imageList1.Images.Add(myIcon);
            listView1.Items.Add(strFileName, nIndex++);
		}
		
		//Schritt 3. (Problema...ImageList wird nicht geleert!!)
		void Button2Click(object sender, EventArgs e)
		{
            string strFileName = @"C:\Info.ico";
            //imageList1.Images.Clear();			
            //imageList1 = null;	
            //imageList1.Dispose();		
            //listView1.SmallImageList = null;
            //listView1.StateImageList = null;           
            //listView1.Columns.RemoveAt(0);
            //listView1.Clear();
            //listView1.Items.Clear();
            //listView1.Refresh();

			listView1.View = View.Details;
		    listView1.Items.Add(strFileName);
		}
T
50 Beiträge seit 2014
vor 9 Jahren

Also bin zwar kein Pro aber ich leere meine Listview immer so:


            for (int a = Listview1.Items.Count - 1; a >= 0; a--)
            {
                Listview1.Items.RemoveAt(a);
            }
            Listview1.Refresh();

2.207 Beiträge seit 2011
vor 9 Jahren
P
Pacher Themenstarter:in
18 Beiträge seit 2015
vor 9 Jahren

Hallo, @Torni und @Coffebean!

Danke für die Antworten. Beide Methoden hatte ich natürlich schon getestet und leeren auch die ListView von den Items.
Das Problem liegt eher an der „Bindung“ ListView – ImagList!
Sobald einmal eine Zuweisung erfolgt, bekomm ich die nicht mehr aus der ListView raus und es bleibt ein 16x16 „Platzhalter“ (siehe Bild 3).
Kann man die ListView ev. irgendwie „neu Initialisieren“, ohne die Anwendung neu zu starten?