button->Text

0

Jak zrobić żeby w czasie wykonywania pętli na buttonie wyświetlał się numer jej obiegu?
Przykładowo:

for (int i = 0; i < 10; i++)
            {
                klient.Send(wiadomość);
                button1.Text = Convert.ToString(m);
                m++;
            }

Na buttonie nie wyświetla się w czasie wykonywania pętli 1 potem 2, 3, itd. aż do 9. Tylko zamiast tego dopiero po wykonaniu wszystkich obiegów pętli czyli po zakończeniu jej wykonywania na buttonie pojawi się "9". Jak rozwiązać problem?

0

Musisz użyć wątku, jak poniżej:


delegate void SetTextCallback();

private void Update()
{
      for (int i = 0; i < 10; i++)
            {
                klient.Send(wiadomość);
                if (button1.InvokeRequired)
                {
                  this.BeginInvoke(new SetTextCallback(SetText), null);
                }else
                 {
                button1.Text = Convert.ToString(m);
                }
                m++;
             //watek spi na 1 milisekunde, wazne jesli chcesz miec dostep do formy w czasie dzialania watku
             Thread.Sleep(1);
            }
}

private SetText()
{
    button1.Text = Convert.ToString(m);
}

//uruchomienie
Thread th = new Thread(new ThreadStart(Update));
th.isBackground = true;
th.Start();

0

Hmm chyba nie zgodzę się do końca z powyższym kodem.
Po co ten sleep? Update powinno wykonywać się w osobnym wątku i faktycznie modyfikacja gui powinna być wykonana przez Invoke (po co BeginInvoke).
Metoda SetText skąd bierze "m"?

delegate void SetButtonTextDelegate(string text);

private void Update()
{
      for (int i = 0; i < 10; i++)
      {
                klient.Send(wiadomość);
                SetButtonText(m.ToString());
                m++;
      }
}
 
private SetButtonText(string text)
{
  if (button1.InvokeRequired)
    button1.Invoke((new SetButtonTextDelegate(SetButtonText))(text));
  else
    button1.Text = text;
}
0

for (int i = 0; i < 10; i++)
{
klient.Send(wiadomość);
button1.Text = Convert.ToString(m);
Application.DoEvents
m++;
}

to jest obejście ale działa
0

jasne że dla małej pętli można wywołaś invalidate czy refresh, ale jeśli będzie ostro mielił w osobnym wątku, to niech od razu nauczy się jak należy poprawnie zrealizować taki schemat

1 użytkowników online, w tym zalogowanych: 0, gości: 1