NorwegianSF Skrevet 9. mars 2013 Del Skrevet 9. mars 2013 Hei, Jeg holder på med et program skrevet i C#/.NET som skal inneholde en mappeliste som vises i ListView. Denne ser slik ut: Når man huker av foran mappene så er det meningen at man skal kunne fjerne disse mappene fra ListView'et men av en eller annen grunn så går ikke dette. Jeg har prøvd følgende måter å gjøre det på: foreach (ListViewItem listViewItem in folderListView.SelectedItems) { listViewItem.Remove(); } for (int i = 0; i < folderListView.Items.Count; i++) { if (folderListView.Items[i].Selected) { folderListView.Items[i].Remove(); i--; } } Jeg har ikke holdt på så lenge med C#/.NET men jeg trodde det skulle være forholdsvis enkelt å fjerne items fra LW ettersom det gikk fint å legge dem til. Hva gjør jeg galt? Lenke til kommentar
torbjørn marø Skrevet 9. mars 2013 Del Skrevet 9. mars 2013 (endret) Dokumentasjonen sier du skal bruke: listView1.Items.RemoveAt(0); Men du kan også bruke Items sin Remove-metode om du har en referanse til Item-objektet (doc). Da blir det vel dette du trenger: foreach (ListViewItem listViewItem in folderListView.SelectedItems) { folderListView.Remove(listViewItem); } Om ikke det gir deg en exception da fordi du modifiserer den underliggende collectionen du itererer over... Usikker, så prøv! Endret 9. mars 2013 av torbjørn marø Lenke til kommentar
NorwegianSF Skrevet 9. mars 2013 Forfatter Del Skrevet 9. mars 2013 (endret) Jeg prøvde å bruke den måten der nå men det fungerte fortsatt ikke. Her er koden jeg brukte: for (int i = 0; i < folderListView.Items.Count-1; i++) { if (folderListView.Items[i].Selected) { folderListView.Items.RemoveAt(i); i--; } } Har jeg forstått deg riktig når jeg gjør det sånn? Endret 9. mars 2013 av NorwegianSF Lenke til kommentar
NorwegianSF Skrevet 9. mars 2013 Forfatter Del Skrevet 9. mars 2013 (endret) Ser nå at jeg har gjort en liten bommert da jeg skrev koden. Med "selected" så menes det som er klikket på(FOLDER 2 i vedlegget) mens det jeg gjorde var "checked" (FOLDER 1 i vedlegget). Så da har jeg fått det til nå Koden for å ta bort de som er checked blir da: Console.WriteLine("Kjører remove-løkke"); for (int i = 0; i < folderListView.Items.Count; i++) { Console.WriteLine("Kjører løkka for " + i + ".gang"); if (folderListView.Items[i].Checked) { Console.WriteLine("Fant en selected item: " + i); folderListView.Items.RemoveAt(i); i--; } } eller slik om man vil bruke foreach: foreach (ListViewItem listViewItem in folderListView.CheckedItems) { folderListView.Items.Remove(listViewItem); } Endret 9. mars 2013 av NorwegianSF Lenke til kommentar
torbjørn marø Skrevet 9. mars 2013 Del Skrevet 9. mars 2013 Bra det løste seg Ikke ofte man får behov for å modifisere for-løkker på denne måten. Dette fikk meg til å tenke på hvordan man best kommuniserer hvordan løkken fungerer. Hva er best av f.eks. disse mulighetene: for (int i = 0; i < folderListView.Items.Count; i++) { if (folderListView.Items[i].Checked) { folderListView.Items.RemoveAt(i); i--; } } for (int i = 0; i < folderListView.Items.Count; /* no incrementor */) { if (folderListView.Items[i].Checked) folderListView.Items.RemoveAt(i); else i++; } for (int i = 0; i < folderListView.Items.Count; /* no incrementor */) { if (folderListView.Items[i].Checked) { folderListView.Items.RemoveAt(i); continue; } i++; } PS: Håper jeg ikke blander språk her - det heter vel continue i C#? Lenke til kommentar
NorwegianSF Skrevet 9. mars 2013 Forfatter Del Skrevet 9. mars 2013 Det med å modernisere for-løkker(regner med at du mener i++ og i--) var noe jeg leste her som det godkjente svaret. Jeg har ikke helt skjønt hvorfor det gjøres men det er sikkert logisk Ang. continue så tror jeg at det brukes i C# også, mener å huske at foreleseren min brukte det her om dagen. Lenke til kommentar
torbjørn marø Skrevet 10. mars 2013 Del Skrevet 10. mars 2013 Grunnen til at du må si i-- er at listen du itererer over blir kortere når du fjerner elementer. La oss si at elementet med index 2 er haket av (checked). Når du da fjerner elementet på index 2 er det plutselig et nytt element som blir liggende på index 2. Hvis du da bare lar for-løkken fortsette med i = 3 så vil du ha hoppet over et element - DERFOR må du trekke fra én fra i, slik at du sjekker index 2 en gang til. Mine to alternativer sørger for at i kun øker i de tilfellene hvor du ikke fjerner et element. I praksis blir dette det samme. Dvs. mine alternativer er mere effektive fordi de ikke endrer i når elementer fjernes, mens du endrer i to ganger i de tilfellene (i-- og i++), men optimalisering er ikke noe å tenke på i dette tilfellet. Det jeg derimot ville ha tilbakemelding på var hvilket alternativ som best kommuniserer hva som skjer til den som leser koden. Lenke til kommentar
NorwegianSF Skrevet 10. mars 2013 Forfatter Del Skrevet 10. mars 2013 Det var det jeg trodde skjedde så da har jeg fått oppklart det Jeg ville tro at den "enkleste" løkka å forklare er nr 2 men nr 1 er nok den jeg ville endt opp med om ikke jeg hadde valgt foreach-løsningen. Lenke til kommentar
GeirGrusom Skrevet 10. mars 2013 Del Skrevet 10. mars 2013 (endret) foreach(var item in FolderListView.Items.Where(i => i.Checked).ToArray()) { FolderList.Items.Remove(item); } Man skal ikke slette elementer fra listen man itererer over. ToArray sørger for at vi arbeider med en lokal liste som inneholder kun de elementer som faktisk skal bort. Endret 10. mars 2013 av GeirGrusom 1 Lenke til kommentar
NorwegianSF Skrevet 17. mars 2013 Forfatter Del Skrevet 17. mars 2013 Det er nok ikke dumt nei, skal endre på dette asap. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå