Witam.
Jestem w trakcie pisania "wtyczki" do programu magazynowego na którym pracuje.
Sprawa wygląda tak, że napisaną bibliotekę, podpina się pod program i dzięki temu może ona reagować na określone zdarzenia.
Chciałbym żeby w określonej sytuacji zmieniła ona rabaty na wszystkich pozycjach dokumentu.
Zrobiłem to na zasadzie :
for (int i=0; i<IloscPozycji; i++)
{
pozycja[i].rabat = WyliczRabat(pozycja[i].Id, OdbiorcaId);
}
To działa poprawnie, jednak użytkownik nie widzi co się aktualnie dzieje, a przy większych dokumentach (tzn. dokumenty po 1000 - 2000 pozycji) trwa to trochę, bo wartość rabatów nie jest podawana na sztywno tylko wyliczana przez procedurę SQL (metoda WyliczRabat wywołuję to procedurę).
Pomyślałem, że wyświetleń proste okienko wyświetlające postęp i przerobiłem pętle na coś takiego :
Form form = new Form();
form.TopMost = true;
form.StartPosition = FormStartPosition.CenterScreen;
form.Size = new Size(300 , 200);
Label label = new Label();
form.Controls.Add(label);
label.Dock = DockStyle.Fill;
label.TextAlign = ContentAlignment.MiddleCenter;
form.Show();
for (int i=0; i<IloscPozycji; i++)
{
pozycja[i].rabat = WyliczRabat(pozycja[i].Id, OdbiorcaId);
if (i % 100 == 0)
{
label.Text = i.ToString() + " /" + oDok.Pozycje.Liczba.ToString();
Application.DoEvents();
}
}
Jednak strasznie spowolniło to wykonywanie kodu (wcześniej jedna pozycja przeliczała się średnio 0,08 sekundy teraz 0,16 sekundy, co przy 1500 pozycji daje sporą różnicę....).
Na początku napisałem bez warunku if (i % 100 == 0)
- wtedy była zupełna tragedia dlatego odświeżanie zrobiłem co 100.
Pytanie do Was: co zrobić, żeby ten średni obrotu jednej pętli zmniejszyć (a wyświetlanie postępu zostawić).