PDA

Pogčedajte punu verziju : C# checkedListBox.Items.RemoveAt()


Ivan
26. 09. 2008., 23:14
Koristim ovaj kod (dole) za brisanje chekiranih itema ali mi uvek ostaje jedan neobrisan item:

Code:

for (int i = 0; i <= checkedListBox2.CheckedItems.Count - 1; i++)
{
checkedListBox2.Items.RemoveAt(i);
}


checkedListBox2.CheckedItems.Count vraca pravi broj itema ...

U cemu je problem ? Hvala.

bluesman
26. 09. 2008., 23:23
zar nije bolje

i < checkedListBox2.CheckedItems.Count

nego

i <= checkedListBox2.CheckedItems.Count -1

jedna matematicka operacija manje u for petlji.

Pravo pitanje je odakle pocinje index, da li od 0 ili od 1 ?

Nenad Vasić
26. 09. 2008., 23:24
Da li si probao:
for (int i = 0; i < checkedListBox2.CheckedItems.Count; i++)

U suštini je isto kao što si i ti napisao mada te ništa ne košta da probaš. :)

edit: Preteče me bluesman... :)

Ivan
26. 09. 2008., 23:25
Ovo sam uzeo samo primer iz nekog texta, petlju cu da sredim.
Index valjda pocinje od 0 ?

Btw, mislim da moram prvo da uzmem broj itema pa da sa tom varijablom radim u petlji jer se ovako dinamicno menja ... (?)

Nenad Vasić
26. 09. 2008., 23:41
Što ne probaš? A inače moguće je to što si rekao jer se u php-u na primer dešava ovo:
<?php
$blah = array_fill(0, 10, 'blah');

for ($i=0;$i<count($blah);$i++) {
echo count($blah)."\n";
unset($blah[$i]);
}
?>
Output:
10
9
8
7
6

S' tim što ovde iskače iz petlje kad je broj elemenata došao na 5 odnosno kad se $i izjednači sa brojem elemenata...

Ivan
26. 09. 2008., 23:47
Resio sam ovako:

while (checkedListBox2.CheckedItems.Count > 0)
{
checkedListBox2.Items.Remove(checkedListBox2.Check edItems[0].ToString());
}

degojs
27. 09. 2008., 02:23
Btw, mislim da moram prvo da uzmem broj itema pa da sa tom varijablom radim u petlji jer se ovako dinamicno menja ... (?)

Pa mora da se menja kad pozivaš RemoveAt[x] i uklanjaš elemente iz niza. Zato si i imao problem.

Ivan
27. 09. 2008., 12:12
Da da, u tome je bio problem. Obicno skontam resenje kad postavim pitanje ;)

degojs
27. 09. 2008., 16:25
U stvari, ti si sve na ovoj temi naveo da rešavaju krivi problem (uključujući i mene). Ovo što sam ja primetio sinoć je samo jedna stvar, ali problem je u samom algoritmu koji si postavio.

Možda nije loše da još samo malo komentarišemo..


for (int i = 0; i <= checkedListBox2.CheckedItems.Count - 1; i++)
checkedListBox2.Items.RemoveAt(i);


Zamisli da imamo 10 elemenata u kolekciji i da su 4 elementa štiklirana. Tvoj kod gore (ne obraćamo sad pažnju što RemoveAt uklanja elemente, da bude jednostavnije) otprilike radi sledeće:

1. u kolekciji imamo 10 elementa, 4 su štiklirana
2. pošto su 4 elementa štiklirana, ukloni elemente 1, 2, 3 i 4.

Naravno da je pogrešno: to što imamo 4 čekirana elementa, ne znači da su oni na pozicijama 1-4. Čini mi se da je i tu bio problem.

Ivan
27. 09. 2008., 18:20
CheckedListBox.CheckedItems Property (http://msdn.microsoft.com/en-us/library/system.windows.forms.checkedlistbox.checkeditems.a spx)
- Collection of checked items in this CheckedListBox

Cini mi se da "CheckedItems" vraca niz chekiranih itema koji pocinje od 0. (Nisam siguran jer sam pocetnik sto se tice C#-a, javice se vec neko iskusniji ...)

Btw, greska je nastala jer checkedListBox2.Items vraca sve iteme a ne samo one koji su chekirani.

degojs
27. 09. 2008., 18:32
He, ja sam gledao web kontrole i još se pitam gde si našao to CheckedItems? Te sam zaključio da koristiš third-party kontrolu i slično. Nisam uopšte ni pomislio da radiš WinForms, da tamo pogledam. Hehe, dotle se znači stiglo - meni više ne pada na pamet da neko pravi desktop aplikaciju :)

Btw, greska je nastala jer checkedListBox2.Items vraca sve iteme a ne samo one koji su chekirani.

Da, i, kako rekoh, uklanjao si onda krive elemente iz niza. Ti si kao rekao npr. imamo 3 čekirane stavke (CheckedItems.Count), daj da uklonim prve 3 (Items.RemoveAt[i])...

Anyway.. :)

Ivan
28. 09. 2008., 21:47
Zatrebaju po nekad neki custom alati za upravljanje procesima/fajlovima i sl, a u C#-u se to veoma jednostvano napravi ;)