Diskuze: Hromadná změna pozadí u více labelů
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zjistil jsem, že když ten cyklus foreach dám na tlačítko místo na
událost load a pak když na to tlačítko několikrát kliknu, tak po každém
kliknutí se zprůhlední pozadí u poloviny labelů z celkového počtu, kde
pozadí průhledné není. Takže když mám 16 labelů, tak po prvním
kliknutí se jich zprůhlední 8, po druhém kliknutí zbydou neprůhledné 4,
po dalším kliknutí se zprůhlední další 2, po dalším kliknutí zbyde už
jen jeden a nakonec je průhledné pozadí u všech labelů. Proč se tohle děje?
Teď mě akorát napadá
foreach(Label lbl in this.Controls)
lbl.BackColor = Color.Transparent;
A jinak se to asi děje tím cyklem, když jsem si to zkusil s 5 Labely krokovat, tak se ten cyklus provedl jen 3krát; (Hrozně mě to připomíná situaci, když se maže z Listu od první položky, pak se posouvá pořadí položek a když to není ošetřeno, tak to přeskakuje podobně).
Zirko:
To mi nějak nefunguje vůbec.
rwn:
Dal jsem to do událoti pictureBox_Paint a ono to funguje. Jiné pozicování mi
nevadí. Neni to ale moc dobré řešení, protože zrovna tuhle událost
vyvolávám celkem často (každých 25ms) na základě časovače, protože tam
mám už jiný kod (Graphics.DrawImage). Prostě to ten cyklus ve výsledku
zpomaluje. Tak mě napadlo dát to do podmínky dotazované na pomocnou
proměnnou a po projetí cyklu změnit stav pomocné proměnné, takže díky
tomu cyklus projede jen jednou. A jsem tam, kde jsem byl. Když nechám cyklus
projet vícekrát, tak to má stejný efekt, jako jsem výše popisoval to
klikání na tlačítko. Takže když ten cyklus foreach nechám projet asi 4x
tak je výsledek dobrý, ale i tak mi to trošku zpomaluje tu aplikaci.
Zatím jsem to vyřešil tak, že ten původní cyklus foreach (ten, co je v mém prvním příspěvku) jsem dal do cyklu for, který proběhne 4x a to celé je dané v události Form1_load. Takže takhle mi to funguje, ale nevím, jak si to odůvodnit. Nevím proč to pokaždé změní požadované vlastnosti jen u poloviny prvků (kontrolek).
Můžeš někde upnout ten projekt? Nechce se mi to simulovat tak nato kouknu přímo.
V poznámce tam je ten cyklus for, se kterým mi to funguje. Není to ale
nejlepší řešení, i když pro tuto aplikaci asi dostačující. Hlavně by
mě zajímal důvod, proč ten cyklus foreach provede požadovanou operaci vždy
jen pro polovinu kontrolek.
foreach (Control ctrl in this.Controls.Cast<Control>().ToList())
{
...
}
Jde o to, že když nastavíš Parent každému controlu, tak zmizne z té kolekce, takže pokaždé když nastavíš Parent tomu kontrolu, tak máš počet - 1, pak to zblbne ten enumerátor a proiteruje jen část. Takže si je takhle uložíš napevno do kolekce a iteruješ jí a je jedno k jaké kontrolce patří.
Jinak všechno tohle bys nemusel řešit, kdybys použil panel, který je přesně na tyhle věci (skládání kontrolek do nečeho). Ty třeba ještě nemusíš řešit to, že to máš přes celý form, ale jakmile bys měl ten picturebox třeba jen poloviční, musel bys přepočítávat lokaci apod. takže to změn na Panel a budeš to mít lehčí.
Zobrazeno 12 zpráv z 12.