Portál AbcLinuxu, 6. května 2025 07:27

Dotaz: [C#] foreach, delete textbox a label

22.11.2016 10:25 Lanny2013 | skóre: 2
[C#] foreach, delete textbox a label
Přečteno: 380×
Odpovědět | Admin
Příloha:
Dobrý den, snažím se odstranit určité Texboxy a Labely které jsou dynamicky vytvořené v Groupboxu. Chtěl bych, ale odstranit jenom některé. Problém je v tom, že se mi vždy podaří odstranit všechny Labely ale Textbox pouze ten první. Můžete mi prosím poradit kde mám chybu. předem děkuji.


Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

22.11.2016 12:43 Jamie
Rozbalit Rozbalit vše Re: [C#] foreach, delete textbox a label
Odpovědět | | Sbalit | Link | Blokovat | Admin
Chtělo by to sem dát i ten kód, který ty prvky vytváří. Navíc by se kolekce, kterou procházíš přez foreach, neměla měnit.
skunkOS avatar 1.12.2016 09:02 skunkOS | skóre: 27 | blog: Tak nějak
Rozbalit Rozbalit vše Re: [C#] foreach, delete textbox a label
Přesně tak. Kdykoliv dochází k nějakým destrukcím v kolekci, kterou iteruješ přes foreach, je to náběh na chybu. Když se něco v kolekci mění, použij for.
http://martinrotter.github.io
22.11.2016 12:50 Jamie
Rozbalit Rozbalit vše Re: [C#] foreach, delete textbox a label
Odpovědět | | Sbalit | Link | Blokovat | Admin
Btw. které "některé" chceš odstraňovat. Neměl by v každém foreach být ještě for (místo použití h a i)?
22.11.2016 17:16 Lanny2013 | skóre: 2
Rozbalit Rozbalit vše Re: [C#] foreach, delete textbox a label
Ahoj posílám čás kodu, který vkládá prvky. Zde si ale myslím, že chyba není.
Label label2 = new Label();
label2.Name = "labelg" + TxtInt;
label2.Top = LabelTop + 30;
label2.Width = 10;
label2.Left = LabelLeft + 101;
label2.Text = "-";
Form3.form4.groupBox3.Controls.Add(label2);

TextBox txt2 = new TextBox();
txt2.Name = "txtbox" + TxtInt;
txt2.Top = TextboxTop + 30;
txt2.Left = TextboxLeft + 52;
txt2.Width = 114;
txt2.Height = 20;
txt2.Text = StandartUcetAdd.cislo;
Form3.form4.groupBox3.Controls.Add(txt2);

TxtInt++;
Co se téče cyklu for tak ten jsem nechtěl použít, jelikož neznám konečný počet prvků dopředu. Nicméně jsem to upravil tak, že nejprve zjistím celkový pořet prvků.
int count =  groupbox.Controls.Count;
potom přes for vybrat jenom určité prvky do určitého čísla int count. I tak to ale nefunguje chová se to úplně stejně jako bez for. A to tak, že když mám jeden foreach třeba na textbox tak je vše v pořádku. Jakmile za to přidám druhý foreach na vymazání lablelu tak se provede jenom ten první foreach a ten druhý se neprovede. Když je prohodím tedy prvně chci vymazat label a potom textbox. Tak je to přesně naopak label vymaže, ale textboxy už ne.
22.11.2016 19:26 MadCatX
Rozbalit Rozbalit vše Re: [C#] foreach, delete textbox a label
A nevyhodí ti to nějakou vyjímku? Upravovat si „pod rukama“ vektor, který procházíš cyklem není dobrý nápad. Dej si do toho kódu breakpoint a vykrokuj si to debuggerem.
pavlix avatar 22.11.2016 19:35 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: [C#] foreach, delete textbox a label
Mimochodem, jak se to správně dělá v C#? V pythonu je to triviální.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
23.11.2016 09:59 kaaja | skóre: 24 | blog: Sem tam něco | Podbořany, Praha
Rozbalit Rozbalit vše Re: [C#] foreach, delete textbox a label
Správně jde například použít .ToList() z LINQ, které prakticky klonuje kolekci do listu. A tu už při procházení neměníš.
pavlix avatar 23.11.2016 10:28 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: [C#] foreach, delete textbox a label
Používám list(something) v Pythonu, takže je to zjevně ekvivalentní.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
Řešení 1× (Lanny2013 (tazatel))
30.11.2016 16:30 Lanny2013 | skóre: 2
Rozbalit Rozbalit vše Re: [C#] foreach, delete textbox a label
Omlouvám se za pozdní odpověď. Přesně jak píšeš nakonec jsem ten kod změnil úplně. Použil jsem jak jsi psal LINQ a dosáhl jsem požadovaného výsledku. Děkuji

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.