Dynamiczne dodawanie i odczytywanie danych z kontrolek

0

Witam, już parę dni meczę pewien program, który miałby generować proste równania matematyczne, Napisałem już prawie cała metodę generująca potrzebne do równania TextBoxy i TextBloki, lecz teraz nie wiem jak zrobić metodę aby obsłużyła event TextChanged do dodanych TextBoxow. Moze sprawa rozjaśni się gdy pokaże kod:

 private void generujrownania()
        {
            for (int i = 0; i < 10; i++)
            {
                StackPanel rownanie = new StackPanel();
                rownanie.HorizontalAlignment = HorizontalAlignment.Left;
                rownanie.VerticalAlignment = VerticalAlignment.Top;
                rownanie.Orientation = Orientation.Horizontal;

                TextBox boxpusty = new TextBox();
                TextBlock dodawanie = new TextBlock();
                TextBlock skladniksumy = new TextBlock();
                TextBlock rownasie = new TextBlock();
                TextBlock wyniksumy = new TextBlock();
            
                //Jak przypisac event do textboxu? 
                boxpusty.TextChanged = TextChangedEventArgs;

                //Cos tych image nie wyświetla ;/
                Image ok = new Image();
                ok.Source = new BitmapImage(new Uri("C:/Users/Kamil/documents/visual studio 2012/Projects/ematma/ematma/images/ok.png", UriKind.Relative));
                Image notok = new Image();
                notok.Source = new BitmapImage(new Uri("C:/Users/Kamil/documents/visual studio 2012/Projects/ematma/ematma/images/notok.png", UriKind.Relative));

                dodawanie.Text = "+";            
                skladniksumy.Text = random.Next(0, 10).ToString();
                rownasie.Text = "=";
                wyniksumy.Text = (int.Parse(skladniksumy.Text) + random.Next(0, 10)).ToString();
                rownanie.Children.Add(boxpusty);
                rownanie.Children.Add(dodawanie);
                rownanie.Children.Add(skladniksumy);
                rownanie.Children.Add(rownasie);
                rownanie.Children.Add(wyniksumy);
                rownanie.Children.Add(ok);
                rownanie.Children.Add(notok);
                SPnarownania.Children.Add(rownanie);
            }
            UpdateLayout();
        }

       // Coś takiego wyobrażam sobie ta funkcje sprawdzająca, lecz w tej wersji VS nie widzi dodanych wyżej TextBoxow i TextBlockow 
        private void dodawanie(object sender, TextChangedEventArgs e) 
        {
            int pierwszy = int.Parse(boxpusty.Text);
            int drugi = int.Parse(skladniksumy.Text);
            int wynik = int.Parse(wyniksumy.Text);

            if (pierwszy + drugi == wynik)
            {
                ok.Visibility = Visibility.Visible;
                notok.Visibility = Visibility.Collapsed;
            }
            else
            {
                notok.Visibility = Visibility.Visible;
                ok.Visibility = Visibility.Collapsed;
            }
        }
 

Zwracam się z prośbą do Was bo już nie mam pomysłów jak to napisać.
Z góry Wielkie Dzięki

0

boxpusty.TextChanged += new EventHandler(dodawanie);
boxpusty.TextChanged += dodawanie;
czy jakkolwiek ta funkcja się nazywa.

0

Hej, dzięki za odpowiedzi, podany przez Ciebie kod nie do końca jeszcze u mnie działa, ogolenie trochę dziś zmieniałem w nazwach funkcji oraz naprawiłem wyświetlanie obrazków. Zostało mi parę błędu które nie wiem jak naprawić. oto zmieniony kod:

  
        public void generujrownania()
        {
            for (int i = 0; i < 10; i++)
            {
                StackPanel rownanie = new StackPanel();
                rownanie.HorizontalAlignment = HorizontalAlignment.Left;
                rownanie.VerticalAlignment = VerticalAlignment.Top;
                rownanie.Orientation = Orientation.Horizontal;

                TextBox boxpusty = new TextBox();
                TextBlock dodawanie = new TextBlock();
                TextBlock skladniksumy = new TextBlock();
                TextBlock rownasie = new TextBlock();
                TextBlock wyniksumy = new TextBlock();

                boxpusty.TextChanged += new EventHandler(sprdodawanie);  //błąd :Cannot implicitly convert type 'System.EventHandler' to 'Windows.UI.Xaml.Controls.TextChangedEventHandler'	
               
                Image notok = new Image();
                notok.Width = 40;
                notok.Source = new BitmapImage(new Uri("ms-appx:///images/notok.png", UriKind.Absolute));
                Image ok = new Image();
                ok.Width = 40;
                ok.Source = new BitmapImage(new Uri("ms-appx:///images/ok.png", UriKind.Absolute));
               
                dodawanie.Text = "+";            
                skladniksumy.Text = random.Next(0, 10).ToString();
                rownasie.Text = "=";
                wyniksumy.Text = (int.Parse(skladniksumy.Text) + random.Next(0, 10)).ToString();
                rownanie.Children.Add(boxpusty);
                rownanie.Children.Add(dodawanie);
                rownanie.Children.Add(skladniksumy);
                rownanie.Children.Add(rownasie);
                rownanie.Children.Add(wyniksumy);
                rownanie.Children.Add(notok);
                rownanie.Children.Add(ok);
                           
                SPnarownania.Children.Add(rownanie); //Dodanie do głównego StackPanelu
            }
            UpdateLayout();
        }
        public void sprdodawanie(object sender, EventArgs e) //Zastanawiam się jeszcze czy ta metoda będzie porównywać ze sobą odpowiednie kontrolki
        {
            int pierwszy = int.Parse(boxpusty.Text);  //No i tu problem następny bo nie widzi tych kontrolek: The name 'boxpusty' does not exist in the current context	
            int drugi = int.Parse(skladniksumy.Text); //jw
            int wynik = int.Parse(wyniksumy.Text);    //jw

            if (pierwszy + drugi == wynik)
            {
                ok.Visibility = Visibility.Visible;
                notok.Visibility = Visibility.Collapsed;
            }
            else
            {
                notok.Visibility = Visibility.Visible;
                ok.Visibility = Visibility.Collapsed;
            }
        } 

Macie jakieś pomysły jak je rozwiązać?

0

Okej się pomyliłem powinno być:

boxpusty.TextChanged += sprdodawanie;

a co do tego:

 int pierwszy = int.Parse(boxpusty.Text);  //No i tu problem następny bo nie widzi tych kontrolek: The name 'boxpusty' does not exist in the current context        
            int drugi = int.Parse(skladniksumy.Text); //jw
            int wynik = int.Parse(wyniksumy.Text)

boxpusty, skladniksumy, wyniksumy
tworzysz jako zmienne lokalne w funkcji
generuj
wiec nie możesz się ich użyć w
sprdodawanie

0

no dlatego jakos je zrobic globalnie, nie wiem czy moze przed tablice je zrobic? Co myślisz? czy Klase? czy Kolekcje?

0

stwórz w polu klasy tablice, powinno wystarczyć chociaż już w tym całym programie co to ma robić się pogubiłem. :D

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