Dynamiczne textboxy

0

Witam, próbuje wyświetlić dynamiczne textboxy lecz Visual 2012 widzi błędy:

"Error 1 'Windows.UI.Xaml.Controls.Page' does not contain a definition for 'Controls' c:\users\kamil\documents\visual studio 2012\Projects\ematma\ematma\MainPage.xaml.cs 41 20 ematma"
Czy mogłby ktoś mi powiedzieć jak to rozwiazać? oto kod MainPage.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
namespace ematma
{
    
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }     
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }
        private void generuj(object sender, RoutedEventArgs e)
        {
            TextBox[] textb = new TextBox[10];

            for (int i = 0; i < textb.Length; ++i)
            {
                textb[i] = new TextBox();
                textb[i].Text = "Value " + i;
                
               
              Page.Controls.Add(textb[i]); // <- tu wyświetla błąd. Ogolnie nie wiem czy tam powinien byc 'Page'
            }
        }
    }
}
1

Nie powinno być tam tego Page bo nie ma to w ogóle sensu. :P
Elementy dodawaj do jakiegoś panelu np. Grid, StackPanel czy tam jeszcze inne.
np.
w .xaml:

<StackPanel x:Name="myStackPanel">
</StackPanel>

w .cs:

myStackPanel.Children.Add(textb[i]);
// na końcu jak już dodasz wszystkie to odśwież layout
myStackPanel.UpdateLayout(); 
0

dzięki teraz już działa :)

0

Mam kolejny problem związany z tematem a mianowicie tworze Textboxy w gridzie ale one nakładają się na siebie. Nie wiem jak przy generowaniu zmienić ich pozycje, próbowałem .margin ale to nie działa. Wiecie może jak to rozwiązać? dodam ze kodze pon win 8

 TextBox[] textb = new TextBox[10];
            Random random = new Random();
            for (int i = 0; i < 3; ++i)
            {           
                textb[i] = new TextBox();
                textb[i].Margin = new Thickness(0,0,0,100);
                textb[i].Text = random.Next(0, 100).ToString();
                textb[i].Height = 25;
                textb[i].Width = 25;               
                    
                form.Children.Add(textb[i]);
            }
            UpdateLayout();
1

Ustaw sobie jeszcze w swoich TextBoxach:

textb[i].HorizontalAlignment = HorizontalAlignment.Left;
textb[i].VerticalAlignment = VerticalAlignment.Top;

i wtedy wiadomo odkąd margines ma się zaczynać. W tym wypadku co powyżej od lewego górnego rogu.

Ale ja bym zamienił tego Grida na StackPanel który sam rozstawia przyciski kolo siebie bez kombinowania z marginesami.

0

ok dzieki działa, w stack panelu chciałem to zrobic lecz wtedy one tez by musiały byc generowane dynamiczne, ogolnie moj plan jest taki zeby tworzyc rozne rownania matematyczne jedno pod drugim z lookami do uzupelnienia. np [] * 8 = 64, 15 - [] = 7


            StackPanel[] stackpanel = new StackPanel[10];
            TextBox[] textb = new TextBox[10];
            Random random = new Random();
            for (int i = 0; i < 3; ++i)
            {
                stackpane[i] = new Stackpanel();
            //  stackpanel[i].Name  <- tu nie wiem jak przypisac nazwe zeby do niej potem przypisac textboxy
                textb[i] = new TextBox();
                textb[i].HorizontalAlignment = HorizontalAlignment.Left;
                textb[i].VerticalAlignment = VerticalAlignment.Top;
                textb[i].Margin = new Thickness(10+(25*i),10,0,0);
                textb[i].Text = random.Next(0, 100).ToString();
                textb[i].Height = 0;
                textb[i].Width = 25;               
                //form.Children.Add(textb[i]);
                //stackpanel[i].Children.Add(textb[i]);     <- no tu ten problem przypisania        
                form.Children.Add(textb[i]);

            }
            UpdateLayout();

 
0

W WPF okno zawsze ma główny kontent zazwyczaj jest to Grid nazwijmy go "mainGrid" do niego pakujesz co chcesz i ile chcesz. Ty chcesz mieć kilka StackPaneli z paroma textboxami w środku.

mainGrid <- do niego dodajesz StackPanele <- do StackPaneli dodajesz TextBoxy.

Robi się z tego taka hierarchia, drzewo.

Pomieszałeś kolejność u siebie więc powychodziły głupoty.
Tak w ogóle to tworzysz jednego StackPanel i dodajesz do niego jednego textboxa. :P Bardziej powinno być chyba że w jednym StackPanelu masz zestaw textboxów które jest tym Twoim równaniem. :P

Co do definiowania Name w behind codzie to bym sobie odpuścił skoro masz tablice obiektów.

0

wiozłem sobie twoja rade do Serca i stworzyłem coś takiego i dalej mam trochę kłopotów :

private void generuj(object sender, RoutedEventArgs e)
        {
            Random random = new Random();
            for (int i = 0; i < 10; i++)
            {                   
                StackPanel dynamicstackpanel = new StackPanel(); // po kolejnym użyciu tej metody na gridzie nakładają się controli chcialem tego uniknąć poprzez usuwanie 
                if (dynamicstackpanel.Children.Count > 0 )             // istniejących lecz coś ten if nie działa i nie wiem dlaczego jakbyście znali sposób jak to zrobić było by super
                {
                    maingrid.Children.Remove(dynamicstackpanel);                   
                }
                
                TextBox firsttextbox = new TextBox();                
                firsttextbox.Text = random.Next(0, 10).ToString();
                TextBlock znak = new TextBlock();
                znak.Text = "*";
                znak.FontSize = 30;
                TextBox secondtextbox = new TextBox();
                TextBlock rowna = new TextBlock();
                rowna.Text = "=";
                TextBlock wynik = new TextBlock();
                wynik.Text = random.Next(0, 100).ToString();

                dynamicstackpanel.HorizontalAlignment = HorizontalAlignment.Left;
                dynamicstackpanel.VerticalAlignment = VerticalAlignment.Top;
                dynamicstackpanel.Orientation = Orientation.Horizontal;
                dynamicstackpanel.Margin = new Thickness(0,10+i*30,0,0);

                dynamicstackpanel.Children.Add(firsttextbox);
                dynamicstackpanel.Children.Add(znak);
                dynamicstackpanel.Children.Add(secondtextbox);
                dynamicstackpanel.Children.Add(rowna);
                dynamicstackpanel.Children.Add(wynik);
                maingrid.Children.Add(dynamicstackpanel);  
            }
      
            UpdateLayout();
     
        } 

kolejna kwestia to z czytanie danych z texboxow, nie wiem jak się odwołać do nich , może wiecie jak to zrobić ?
z góry dzięki za wsparcie :)

0

W takim bądź razie zrób trochę inaczej. :P Stwórz jeszcze jedne Grid specjalnie dla Twoich danych.
Np. daneGrid i bez obaw będziesz mógł czyścić całość: daneGrid.Children.Clear();

If jest bez sensu próbujesz usunąć coś co nie zostało dodane jeszcze. A do tego próbujesz usunąć tylko jedne element z całej kolekcji a przecież masz tam kilka stack paneli.

No i ostatnia rzecz potrafisz coś dodać do textboxa a nie potrafisz wyciągnąć :D

string a = wynik.Text

Wychodzi na to że nie ogarniasz kompletnie tego. :P

0

Hej dzięki za odpowiedzi, no na razie się uczę :) jestem samoukiem , szukam pomocy w goglach i na forach, wiem ze jeszcze dużo przede mną ale najlepiej się uczyć się programowość wyznaczając sobie jakiś cel(np ten).
Wracając do kodu. Ten if znajduje się z zdarzeniu buttona który generuje te textboxy i textbloki. Mi chodziło o to ze ten if ma sprawdzać czy jeśli jest już coś w tym kontenerze to ma usunąć wszystkie kontrolki z niego.

a jak odebrać dane z textboxu wiem pod warunkiem jeśli wiem jaką ta kontrolka ma name. tu tworze je dynamicznie i nie mam pojęcia jak np odwołać się do poszczególnych textboxow,textblokow. np

  1. [] + 7 = 10,
  2. 6 * [] = 30,
    i teraz jak je poznać który to który?
    Gdzieś widziałem jak ktoś ma to zrobione w tablicy i wtedy po indeksie wie który box jest w danym wierszu. ( czy to jest dobry pomysł?)

Z góry jestem wdzięczny za rady :)

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