Odswieżanie wartosci textboxa

0

Czesc;
Mam pytanie jak zmieniac wartosci TextBoxa po uplywie jakiegos czasu. Zeby warotsc zmeinaial sie samoczynnie powiedzmy po 3 sek bez ingerencji uzytkownika ( odpada klikanei jakis przyciskow itp )
tutaj fragment mojego kodu:

 InitializeComponent();

            

            Text_pole1.Text =   "8";


            Thread.Sleep(3000);

            Text_pole1.Text =   "6";

```c#

obecnie mam domyslna wartosc text_pole1 ustawiona na 3, Po uruchomieniu programu wartosc zmeiniana jest na 8 chcialbym zeby po 3 sek zmeinila sie na np 6
0

Użyj Timera.

0

Dziękuję za radę.
Kombinuje z Timerem. Ale nie do końca umiem zrobić to co bym chciał.
Z tego co widze Timerem można wywolywac eventy.
A ja bym chciał wywolac metode , która zapełnia około 30 textboxow odpowiednimi wartosciami.
Obecnie wygląda to tak :

Boisko boisko = new Boisko(zaw1, zaw2);

            InitializeComponent();

            DispatcherTimer timer = new DispatcherTimer();

            timer.Interval = TimeSpan.FromSeconds(10);

            for (int i = 0; i < 3; i++)
            {
                zaw1.Sciezka1(ref zaw1);
                boisko = new Boisko(zaw1, zaw2);
                timer.Tick += WydrukBoiska(boisko);  // tu jest wywolanie metody
                timer.Start();
                WydrukBoiska(boisko);
            }

  private void WydrukBoiska(Boisko boisko)  // tu metoda
        {
            TB_0_0.Text = boisko.Wypelnij(0, 0);
            TB_1_0.Text = boisko.Wypelnij(1, 0);
            TB_2_0.Text = boisko.Wypelnij(2, 0);
            TB_3_0.Text = boisko.Wypelnij(3, 0);
            TB_0_1.Text = boisko.Wypelnij(0, 1);
            TB_1_1.Text = boisko.Wypelnij(1, 1);
            TB_2_1.Text = boisko.Wypelnij(2, 1);
            TB_3_1.Text = boisko.Wypelnij(3, 1);
            TB_0_2.Text = boisko.Wypelnij(0, 2);
}

Obecnie dostaje komunikat, że nie mozna niejawnie przekierować typu void na System.EventHandler.

0
System.Timers.Timer timer = new System.Timers.Timer(10000);
            timer.Elapsed += (s, e) => {
                
                Invoke(new Action(() =>
                {
                    WydrukBoiska(Boisko boisko);

                }));
            };
            timer.Start();
0

Hej; Dzieki.
Jednak mam błąd odnośnie metody Invoke: metoda nie istnieje w bierzacym kontekście.
Jak obejść ten problem?

0

To pokaż więcej kodu. To jest WinForms? Można użyć timera z Toolbox-a.
Timer uruchamia event a w evencie wywołujesz metodę.
W ogóle pokazuj co piszesz bo mi się nie chce zgadywać :)

0

Kodu nie ma za wiele :) Robie aplikacje WPF.
Mam okolo 30 textboxów. Moim celem jest zapelnainie ich odpowiednimi wartosciami zaleznie od sytuacji.
Do wpisaywnia wartosci do textboxow słuzy metoda : ** private void WydrukBoiska(Boisko boisko)**
Chcialbym zeby ta metoda byla wywolywana co jakis okres czasu ( np 5 sek)

namespace Futbol
{
    /// <summary>
    /// Logika interakcji dla klasy MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        

        public MainWindow()
        {

            Zawodnik zaw1 = new Zawodnik();

            zaw1.Numer = 1;
            zaw1.Poz_x = 1;
            zaw1.Poz_y = 0;

            Zawodnik zaw2 = new Zawodnik();

            zaw2.Numer = 2;
            zaw2.Poz_x = 3;
            zaw2.Poz_y = 0;

            Boisko boisko = new Boisko(zaw1, zaw2);

            InitializeComponent();

        
            for (int i = 0; i < 3; i++)
            {
                zaw1.Sciezka1(ref zaw1);

                boisko = new Boisko(zaw1, zaw2);


                System.Timers.Timer timer = new System.Timers.Timer(5000);
                timer.Elapsed += (s, e) => {

                    Invoke(new Action(() =>             // w tej linii mam bład :  metoda nie istnieje w bierzacym kontekście.
                    {
                        WydrukBoiska(boisko);

                    }));
                };
                timer.Start();
            }

        }

       
        private void WydrukBoiska(Boisko boisko)   // tutaj jest ustawiana wartosc dla ponad 30 textboxow
        {


            TB_0_0.Text = boisko.Wypelnij(0, 0);
            TB_1_0.Text = boisko.Wypelnij(1, 0);
            TB_2_0.Text = boisko.Wypelnij(2, 0);
            TB_3_0.Text = boisko.Wypelnij(3, 0);
            TB_0_1.Text = boisko.Wypelnij(0, 1);
            TB_1_1.Text = boisko.Wypelnij(1, 1);
}

0

Ech, no właśnie...

Jak słyszę WPF to się zwykle nie odzywam ale, ALE!!!

Twój kod chyba nie ma szans poprawnie działać.

 for (int i = 0; i < 3; i++)
            {
                zaw1.Sciezka1(ref zaw1);

Co ta metoda robi, ze potrzebuje ref do siebie?

                boisko = new Boisko(zaw1, zaw2);

Wcześniej tworzysz Boisko boisko = new Boisko(zaw1, zaw2); a tu potem w pętli 3 razy to samo.

                System.Timers.Timer timer = new System.Timers.Timer(5000);
                timer.Elapsed += (s, e) => {

                    Invoke(new Action(() =>             // w tej linii mam bład :  metoda nie istnieje w bierzacym kontekście.
                    {
                        WydrukBoiska(boisko);

                    }));
                };
                timer.Start();
            }

Uruchomienie tego timera powinna być poza tą pętlą. Bp teraz to CI utworzy 3 timery i każdy będzie co 5 s chciał aktualizować. Sensu to nie chyba ma (no chyba że jakiś ma).

Może jakoś tak


private Boisko boisko;

public MainWindow()
        {
            InitializeComponent();

            Zawodnik zaw1 = new Zawodnik();

            zaw1.Numer = 1;
            zaw1.Poz_x = 1;
            zaw1.Poz_y = 0;

            Zawodnik zaw2 = new Zawodnik();

            zaw2.Numer = 2;
            zaw2.Poz_x = 3;
            zaw2.Poz_y = 0;

            boisko = new Boisko(zaw1, zaw2);

                        DispatcherTimer timer = new DispatcherTimer();
                        timer.Interval = TimeSpan.FromSeconds(5);
                        timer.Tick += timer_Tick;
                        timer.Start();


            for (int i = 0; i < 3; i++)
            {
                zaw1.Sciezka1(ref zaw1);

                boisko = new Boisko(zaw1, zaw2); // to jest potrzebne na pewno??? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                
            }

        }

void timer_Tick(object sender, EventArgs e)
                {
                        WydrukBoiska(boisko);
                }
0
jacek.placek napisał(a):

Ech, no właśnie...

Jak słyszę WPF to się zwykle nie odzywam ale, ALE!!!

Twój kod chyba nie ma szans poprawnie działać.

 for (int i = 0; i < 3; i++)
            {
                zaw1.Sciezka1(ref zaw1);

Co ta metoda robi, ze potrzebuje ref do siebie?

                boisko = new Boisko(zaw1, zaw2);

Wcześniej tworzysz Boisko boisko = new Boisko(zaw1, zaw2); a tu potem w pętli 3 razy to samo.

                System.Timers.Timer timer = new System.Timers.Timer(5000);
                timer.Elapsed += (s, e) => {

                    Invoke(new Action(() =>             // w tej linii mam bład :  metoda nie istnieje w bierzacym kontekście.
                    {
                        WydrukBoiska(boisko);

                    }));
                };
                timer.Start();
            }

Uruchomienie tego timera powinna być poza tą pętlą. Bp teraz to CI utworzy 3 timery i każdy będzie co 5 s chciał aktualizować. Sensu to nie chyba ma (no chyba że jakiś ma).

Może jakoś tak


private Boisko boisko;

public MainWindow()
        {
            InitializeComponent();

            Zawodnik zaw1 = new Zawodnik();

            zaw1.Numer = 1;
            zaw1.Poz_x = 1;
            zaw1.Poz_y = 0;

            Zawodnik zaw2 = new Zawodnik();

            zaw2.Numer = 2;
            zaw2.Poz_x = 3;
            zaw2.Poz_y = 0;

            boisko = new Boisko(zaw1, zaw2);

                        DispatcherTimer timer = new DispatcherTimer();
                        timer.Interval = TimeSpan.FromSeconds(5);
                        timer.Tick += timer_Tick;
                        timer.Start();


            for (int i = 0; i < 3; i++)
            {
                zaw1.Sciezka1(ref zaw1);

                boisko = new Boisko(zaw1, zaw2); // to jest potrzebne na pewno??? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                
            }

        }

void timer_Tick(object sender, EventArgs e)
                {
                        WydrukBoiska(boisko);  // tutaj bład 
                }

Niestety nie działa :(
w metodzie timer_Tick(object sender, EventArgs e) kompilator daje informacje, ze nazwa ** boisko** nie istnieje w tym kontekście :(

0

Zobacz dokładnie gdzie ja zadeklarowałem boisko. Przed konstruktorem.

0
jacek.placek napisał(a):

Zobacz dokładnie gdzie ja zadeklarowałem boisko. Przed konstruktorem.

Nie dokonca taki efekt chcialem osiagnac :(
Dostalem ten sam efekt jaki mialem przy użyciu :

 for (int i = 0; i < 3; i++)
            {
                zaw1.Sciezka1(zaw1);
                Thread.Sleep(5000);
                boisko = new Boisko(zaw1, zaw2);

            }

Ja chcialem, żeby wyświetlany był kazdy z 3 kroków pętli. Obecnie wyświetlany jest krok 1 i krok 3 . Próbowalem zrobić to tak:

 for (int i = 0; i < 3; i++)
            {
                zaw1.Sciezka1(zaw1);

                DispatcherTimer timer = new DispatcherTimer();
                timer.Interval = TimeSpan.FromSeconds(5);
                timer.Tick += timer_Tick;
                timer.Start();
                boisko = new Boisko(zaw1, zaw2);
            }


I efekt identyczny :(
Pomocy .

0

Chyba musisz to przemyśleć od początku.
A głównie jakie pytanie chcesz zadać. Ja niewiele rozumiem z tego co chcesz osiągnąć.
Kod w pętli nie ma sensu. Tworzysz 3 boiska a 2 poprzednie idą w kosmos.
To też jest dziwne
Zaw1.sciezka1(zaw1). Po co przekazujesz zaw1 do metody obiektu zaw1?
Wywal wszystko i napisz od początku:)

0

Dzieki jacek.placek za cierpliwosc :)
Napisalem krotki programik zeby wytłumaczyc o co chodzi :

namespace WpfApp1

    public partial class MainWindow : Window
    {
        private int x = 0;

        public MainWindow()
        {
            InitializeComponent();

            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromSeconds(5);
            timer.Tick += timer_Tick;
            timer.Start();

            for (int i= 0; i < 4; i++)
            {
                x = i;

            }
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            wypelnij (x); 
        }

        private void wypelnij ( int x) 

            if (x == 0) TextBox1.Text = "0";
            if (x == 1) TextBox1.Text = "1";
            if (x == 2) TextBox1.Text = "2";
            if (x == 3) TextBox1.Text = "3";
        }
    }
}

Chcialbym , żeby program wyświetlał w odstepie 5 sek. w textboxie kolejno wartosci : 4 (wartosc ustawiona defaultowo) ,0,1,2,3.
Obecnie wyswietla mi 4 ( to co jest wpisane do textboxa na starcie ) i po 5 sek wyswietla ostatni krok czyli wartość 3 (opuszcza krok 1,2 i 3).

0

No właśnie. Dlatego napisałem, żebyś przemyślał bo to co chcesz nie ma sensu.

Zobacz jak to działa.

  1. Tworzysz i uruchamiasz timer. Pierwsze wywołanie eventu timera będzie po 5s.
  2. Po uruchomieniu timera w pętli liczysz od 0 do 3 co zajmuje procesorowi jakieś 0,00000000001 sekundy i od razu masz maksymalną wartość x = 3.
  3. Po pięciu sekundach timer odpala swój event i wyświetla x, które od 4,99999999999 sekundy wynosi 3.

Jeśli w Twoim prawdziwym problemie x zmienia się jakoś inaczej to albo to pokażesz albo nikt nie pomoże. Podałeś zbyt duże uproszczenie.

0

Jest :)
Udało się . Jest efekt jaki chciałem :

namespace WpfApp1

{

    public partial class MainWindow : Window
    {
        private static int x = 0;

        public MainWindow()
        {
            InitializeComponent();

            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromSeconds(3);
            timer.Tick += timer_Tick;
            timer.Start();
     
        }

        private void timer_Tick(object sender, EventArgs e)
        {
                x ++;
            wypelnij(x);
            
        }

        private void wypelnij(int x)
        {
                if (x == 0) TextBox1.Text = "0";
                if (x == 1) TextBox1.Text = "1";
                if (x == 2) TextBox1.Text = "2";
                if (x > 3) TextBox1.Text = "3";                          
        }
    }
}

Dzięki za pomoc :)

0

Kurw... nie wierzę. No ale ok. :)
Tylko sukces jest istotny :)

0
jacek.placek napisał(a):

Kurw... nie wierzę. No ale ok. :)
Tylko sukces jest istotny :)

Już wykorzystałem to uproszczenie w swoim programie :)
Jak byś miał pomysł na optymalizację tego przykładu będę wdzięczny :)

1

Super optymalizacja to nie jest ale

Textbox.Text = x > 3 ? "3" : x.ToSring();

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