Gå til innhold

Anbefalte innlegg

Hei,

 

Jeg holder på med et program skrevet i C#/.NET som skal inneholde en mappeliste som vises i ListView. Denne ser slik ut:

 

Capture.PNG

 

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
Videoannonse
Annonse

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 av torbjørn marø
Lenke til kommentar

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 av NorwegianSF
Lenke til kommentar

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å :)

 

Capture2.PNG

 

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 av NorwegianSF
Lenke til kommentar

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

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 :p

 

Ang. continue så tror jeg at det brukes i C# også, mener å huske at foreleseren min brukte det her om dagen.

Lenke til kommentar

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

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 av GeirGrusom
  • Liker 1
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...