Label nie zmienia tekstu
3 posters
:: Projekt "Madagaskar" :: 4.INNE :: 1.C#: ogólnie
Strona 1 z 1
Label nie zmienia tekstu
Dobry wszystkim!
Piszę tutaj bo mam taki mały, ale dosyć dla mnie dziwny problemik.
Piszę sobie programik do własnego użytku, taki bardzo, bardzo prosty. Wykonuje on w sumie jedno działanie w pętli (for). Ustawiłem sobie kilka labeli, aby informowały mnie o postępach (licznik i aktualnie wykonywana operacja). Wszystko dzieje się po kliknięciu guziorka. Niestety jak zawsze coś musi nie działać. Problem jest taki, że przy przebiegu pętli te labelki nie zmieniają swojej wartości. Jeden zmienia ją raz dopiero po zakończeniu działania programu, a drugi w tym momencie znika.
Debugger pokazuje, że zmienne, jakich wartości mają przyjmować labelki są poprawne.
Pytanie brzmi, dlaczego tak się dzieje i jak temu zaradzić?
Jeśli trzeba to dodam tutaj kod.
PS: jest tam także progressBar, który działa mniej więcej poprawnie. Przy przebiegu pętli staje się szerszy, ale wartości zmieniają się poprawnie. Po pętli jego szerokość jest normalna.
Piszę tutaj bo mam taki mały, ale dosyć dla mnie dziwny problemik.
Piszę sobie programik do własnego użytku, taki bardzo, bardzo prosty. Wykonuje on w sumie jedno działanie w pętli (for). Ustawiłem sobie kilka labeli, aby informowały mnie o postępach (licznik i aktualnie wykonywana operacja). Wszystko dzieje się po kliknięciu guziorka. Niestety jak zawsze coś musi nie działać. Problem jest taki, że przy przebiegu pętli te labelki nie zmieniają swojej wartości. Jeden zmienia ją raz dopiero po zakończeniu działania programu, a drugi w tym momencie znika.
Debugger pokazuje, że zmienne, jakich wartości mają przyjmować labelki są poprawne.
Pytanie brzmi, dlaczego tak się dzieje i jak temu zaradzić?
Jeśli trzeba to dodam tutaj kod.
PS: jest tam także progressBar, który działa mniej więcej poprawnie. Przy przebiegu pętli staje się szerszy, ale wartości zmieniają się poprawnie. Po pętli jego szerokość jest normalna.
purple- Liczba postów : 9
Join date : 01/12/2013
Re: Label nie zmienia tekstu
Najlepiej zamiesc tutaj kod, ktory obsluguje ta funkcjonalnosc. Mogles popelnic wiele bledow, wiec szkoda czasu na zgadywanie
Fores- Liczba postów : 73
Join date : 30/05/2013
Age : 34
Skąd : Katowice
Re: Label nie zmienia tekstu
- Kod:
private void button2_Click(object sender, EventArgs e)
{
progressBar1.Value=0; // progress na 0
label3.Text = "Status: scanning";
WebClient wchtml = new WebClient();
string htmlString = wchtml.DownloadString(textBox1.Text);
Regex pattern = new Regex(@"//i.4cdn.org/[a-z]{1,4}/[0-9]{13}\.[a-z]{3,4}");
MatchCollection links = pattern.Matches(htmlString);
progressBar1.Maximum = links.Count;
label1.Text = "Number of pictures: " + progressBar1.Maximum / 2;
label3.Text = "Status: downloading";
for (int i = 0; i < links.Count; i += 2)
{
string url = "https:" + links[i].Value;
Regex name = new Regex(@"[0-9]{13}\.[a-z]{3,4}");
Match m = name.Match(links[i].Value);
try
{
label3.Text = "Status: downloading("+url+")";
wchtml.DownloadFile(url, folderBrowserDialog1.SelectedPath + "\\" + m.Value);
progressBar1.Value += 2;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
label3.Text = "Status: aborted";
break;
}
}
label3.Text = "Status: completed";
}
}
Działa w tym wszystko z wyjątkiem zmiany tych labeli. Nie do końca rozumiem dlaczego tak się dzieje.
PS: tak, wiem. Nie wygląda to zbyt ładnie.
purple- Liczba postów : 9
Join date : 01/12/2013
Re: Label nie zmienia tekstu
Prawdopodobnie powodem jest to, ze wykonujesz dosc dlugotrwala operacje na glownym watku aplikacji przez co formularz nie jest w stanie sie przerysowac.
Przychodza mi do glowy 2 rozwiazania. Zaczne od tego gorszego, ale i tez duzo latwiejszego:
Mozesz wywolac metode: Application.DoEvents(); po kazdorazowej zmianie labela. Jak sama nazwa wskazuje metoda ta wywola odpowiednie zdarzenia, ktore rowniez przerysuja wartosc labela. Przed uzyciem tej metody poczytaj sobie o niej co nieco w googlach. Z reguly jej uzycie nie jest zalecane, ale jak juz uzyjesz to raczej nic zlego sie nie stanie.
Drugi sposob, ktory ja preferuje - background worker. Za pomoca takiej kontrolki mozesz pewne dlugotrwale operacje (jak na przyklad obliczenia) wywolac w osobnym watku, ktory w trakcie wykonywania nie zawiesi UI. Predzej czy pozniej bedziesz musial sie nauczyc, jak korzystac z wielu watkow, dlatego tez proponuje wybrac ten sposob.
Rozwiazania gotowego Ci nie zamieszcze, gdyz wtedy nic sie nie nauczysz (wiem po sobie), przegladnij sobie te linki:
http://stackoverflow.com/questions/4919058/form-not-responding-when-any-other-operation-performed-in-c-sharp
http://stackoverflow.com/questions/5181777/use-of-application-doevents
http://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners
Jak bedziesz mial pytania, pytaj
Przychodza mi do glowy 2 rozwiazania. Zaczne od tego gorszego, ale i tez duzo latwiejszego:
Mozesz wywolac metode: Application.DoEvents(); po kazdorazowej zmianie labela. Jak sama nazwa wskazuje metoda ta wywola odpowiednie zdarzenia, ktore rowniez przerysuja wartosc labela. Przed uzyciem tej metody poczytaj sobie o niej co nieco w googlach. Z reguly jej uzycie nie jest zalecane, ale jak juz uzyjesz to raczej nic zlego sie nie stanie.
Drugi sposob, ktory ja preferuje - background worker. Za pomoca takiej kontrolki mozesz pewne dlugotrwale operacje (jak na przyklad obliczenia) wywolac w osobnym watku, ktory w trakcie wykonywania nie zawiesi UI. Predzej czy pozniej bedziesz musial sie nauczyc, jak korzystac z wielu watkow, dlatego tez proponuje wybrac ten sposob.
Rozwiazania gotowego Ci nie zamieszcze, gdyz wtedy nic sie nie nauczysz (wiem po sobie), przegladnij sobie te linki:
http://stackoverflow.com/questions/4919058/form-not-responding-when-any-other-operation-performed-in-c-sharp
http://stackoverflow.com/questions/5181777/use-of-application-doevents
http://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners
Jak bedziesz mial pytania, pytaj
Fores- Liczba postów : 73
Join date : 30/05/2013
Age : 34
Skąd : Katowice
Re: Label nie zmienia tekstu
W sumie to odnośnie tego tematu nie mam już pytań. Czytałem trochę na temat tego backgroundWorkera i bardzo przyjemnie się z nim pracuje o dziwno. Na początku dziwnie, ale jak doprowadziłem to jakoś do porządku to nawet ładnie działa i nie jest zbyt skomplikowane.
Dzięki wielkie za naprowadzenie na temat
Dzięki wielkie za naprowadzenie na temat
purple- Liczba postów : 9
Join date : 01/12/2013
Re: Label nie zmienia tekstu
Pewnie juz dawno to rozwiazales, ale czy Background worker dla odswiezania labelek to nie jest przerost formy nad trescia? moze by kod labelek label1.Text wrzucic po prostu do timera z odswiezaniem na 100ms
wojtek656- Liczba postów : 4
Join date : 26/06/2014
Re: Label nie zmienia tekstu
Nie jestem pewien, ale w takim przypadku nawet timer moze zostac zablokowany i nie odswiezac poprawnie interfejsu.
Jesli chcemy isc na latwizne to rownie dobrze mozemy przy kazdej iteracji petli wywolywac metode Update() na labelu i tez bedziemy go miec przerysowywanego, ale to nie jest rozwiazanie problemu.
Jesli chcemy isc na latwizne to rownie dobrze mozemy przy kazdej iteracji petli wywolywac metode Update() na labelu i tez bedziemy go miec przerysowywanego, ale to nie jest rozwiazanie problemu.
Fores- Liczba postów : 73
Join date : 30/05/2013
Age : 34
Skąd : Katowice
:: Projekt "Madagaskar" :: 4.INNE :: 1.C#: ogólnie
Strona 1 z 1
Pozwolenia na tym forum:
Nie możesz odpowiadać w tematach