Odebranie komunikatu od dynamicznie utworzonego Textboxa

0

Witam,

Jestem w trakcie tworzenia aplikacji i natrafiłem na pewien problem.

Na początku użytkownik podaje ile ma być textboxów w pionie i poziomie (np. 4 x 3). I mam to
już fajnie zrobione. Textboxy są tworzone dynamicznie w pętli for.

Teraz chce aby użytkownik wypełnił te pola a po wcisnięciu buttona "oblicz" chcę żeby to co zostało
wpisane do textboxów, było odebrane i wrzucone do tablicy 2 wymiarowej.

Swoją przygodę z c# zacząłem niedawno i dlatego proszę o pomoc.

Poniżej formatka z tym co już mam.

user image

0

Uhm, a z czym jest problem, bo nie zrozumiałem? Znaczy coś zrobiłeś, masz zrobić resztę ok, to zrób.

Pewno problem jest z wczytaniem tych zawartości. O propertisie Text zapewne wiesz, więc pewnie nie wiesz po prostu jak się dostać do tych textBoxów utworzonych dynamicznie. Jest na to prosta rada -> kiedy je tworzysz, referencje do nich dodawaj do jakieś swojej listy/list. Problem możnaby zagmatwać, ale żeb było prosto zrób tak, że wszystkie dodaj do jednej listy. Następnie iterujesz się po nich, gdy chcesz odczytać ich wartość zwykłą pętlą for, tak jak tworzyłeś. Masz informację, która to komórka - wartość "i" w pętli for. Wiesz ile jest wierszy i ile kolumn. Teraz trochę prostej matematyki:
i % wielkość_wiersza - tu masz informację, w któej kolumnie jesteś. Potrzeba jeszcze informacji, w którym wierszu jesteś. To załatwiasz w sposób taki: jeśli i % wielkość_wiersza == 0, zwiększ numer wiersza. Przy czym pamiętaj, żeby zacząć od zerowego wiersza :)

e:
ależ motam. Masz informację ile jest wierszy, masz informację ile jest kolumn a więc:

for (int i = 0; i < ilosc_wierszy; ++i)
{
    for (int j = 0; j < ilosc_kolumn; ++j)
    {
        macierz[i][j] = listaTextboxow[i * ilosc_kolumn + j].text; // tak znajdziesz element na liscie
    }
}
0

Tak tworzę textboxy w pętli:


TextBox[,] listaTextboxow;

for (int i = 0; i < r; ++i)//for1
{
    for (int j = 0; j < n; ++j)//for2
    {
         txt = new TextBox();

         txt.Size = new Size(30, 40);
         txt.Name = "Textbox" + t;
         txt.Location = new Point(pointX, pointY);

         listaTextboxow = new TextBox[r,n];           

         this.Controls.Add(txt); 
         listaTextboxow[i,j] = txt;   //tutaj lista texboxow, tylko nie wiem czy dobrze dodaje referencje??

         pointX += 50;
          t++;

     }//koniec for2

          pointX = 50;
          pointY += 50;
}//koniec for1

a to jest w buttonie "oblicz":


int n = naklady;        //wiersze
int r = reklamodawcy;   //kolumny

dane[,] tabela1 = new dane[n, r];    //tablica 2wymiarowa na dane wejściowe


            for (int i = 0; i < n; ++i)
            {
                for (int j = 0; j < r; ++j)
                {
                    tabela1[i, j].wartosc =  Convert.ToInt32(listaTextboxow[i,j].Text);
                    tabela1[i, j].inx1 = 0;
                    tabela1[i, j].inx2 = 0;

                }
            }//koniec for

Nie działa mi ten kod, nie wiem czy referencje texboxów dobrze do listy zapisuje.

0

Hmm...
Jakby ktoś był zainteresowany moją opinią, to ja do pobierania wartości liczbowych zamiast TextBoxów dałbym NumericUpDown, natomiast dynamicznie dodawane TextBoxy umieściłbym na TableLayoutPanelu - ładnie się wyświetlą i nie trzeba będzie ręcznie ustawiać np. ich pozycji.
Po umieszczeniu tych elementów na formatce i dodaniu przycisków Utwórz i Oblicz cały kod może wyglądać tak:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace DynamicTextboxList
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnUtwórz_Click(object sender, EventArgs e)
        {
            //wyczyszczenie listy kontrolek
            this.tableLayoutPanel1.Controls.Clear();
            //ustawienie liczby kolumn oraz wierszy
            this.tableLayoutPanel1.ColumnCount = (int) this.nudKolumny.Value;
            this.tableLayoutPanel1.RowCount = (int) this.nudWiersze.Value;
            //w pętli po kolumnach i wierszach
            for (int i = 0; i < this.tableLayoutPanel1.ColumnCount; i++)
            {
                for (int j = 0; j < this.tableLayoutPanel1.RowCount; j++)
                {
                    //utworzenie textboxa
                    TextBox txt = new TextBox();
                    txt.Size = new Size(50, 18);
                    txt.Text = "0";
                    txt.Name = String.Format("txt{0:d3}{1:d3}", i, j);
                    //dodanie go do listy
                    this.tableLayoutPanel1.Controls.Add(txt, i, j);
                }
            }
        }

        private void btnOblicz_Click(object sender, EventArgs e)
        {
            //utworzenie tablicy na liczby
            int[,] liczby = new int[this.tableLayoutPanel1.ColumnCount, this.tableLayoutPanel1.RowCount];
            int suma = 0;   //do testów
            //pobranie w pętli
            for (int i = 0; i < liczby.GetLength(0); i++)
            {
                for (int j = 0; j < liczby.GetLength(1); j++)
                {
                    TextBox txt = this.tableLayoutPanel1.GetControlFromPosition(i, j) as TextBox;
                    liczby[i, j] = Int32.Parse(txt.Text);
                    suma += liczby[i, j];
                }
            }
            //wyświetlenie info
            MessageBox.Show("Suma wynosi: " + suma);
        }

    }
}
0

Ciekawe rozwiązanie somekind :-)

Fajnie działa, wykorzystam to na pewno.

Dzięki :-)

0

a jak trzeba byłoby zmodyfikować kod by działał na zasadzie dodawania macierzy :) nie będę wysyłał kodu jaki napisałem bo zostanę tylko wyśmiany :P za szybka odpowiedz z góry serdeczne thx pozdr

0

np. używasz dwóch TableLayoutPanel, dla kazdej macierzy osobny
a dodawanie i mnozenie (oraz regoly jakie macierze mozna dodawac i mnozyc) jest opisane np. na wikipedii

0

yyy no wlasnie tak robie :P ale krzaczy sie ciagle
najwiekszy problem mam z wyswietleniem tab wynikowej

private void macierz_A_Click(object sender, EventArgs e)
{
wyswietlacz_2.Text = "Generowanie macierzy A: ";

        this.tablica_A.Controls.Clear();
        this.tablica_A.ColumnCount = W;
        this.tablica_A.RowCount = K;
        for (int i = 0; i < this.tablica_A.ColumnCount; i++)
        {
            for (int j = 0; j < this.tablica_A.RowCount; j++)
            {
                TextBox A = new TextBox();
                A.Size = new Size(20, 20);
                A.Text = "0";
                A.Name = String.Format("A{0}{1}", i, j);
                this.tablica_A.Controls.Add(A, i, j);
            }

}

//analogicznie macierz B

//i kod sumy

int[,] macierz_A = new int[this.tablica_A.ColumnCount, this.tablica_A.RowCount];
int[,] macierz_B = new int[this.tablica_B.ColumnCount, this.tablica_B.RowCount];
int[,] macierz_wynik = new int[this.tablica_wynik.ColumnCount, this.tablica_wynik.RowCount];
for (int i = 0; i < macierz_A.GetLength(0); i++)
{
for (int j = 0; j < macierz_A.GetLength(1); j++)
{
TextBox A = this.tablica_A.GetControlFromPosition(i, j) as TextBox;
TextBox B = this.tablica_B.GetControlFromPosition(i, j) as TextBox;
TextBox C = this.tablica_wynik.GetControlFromPosition(i, j) as TextBox;
macierz_A[i, j] = Int32.Parse(A.Text);
macierz_B[i, j] = Int32.Parse(B.Text);
macierz_wynik[i, j] = macierz_A[i, j] + macierz_B[i, j];
TextBox Wy = new TextBox();
Wy.Size = new Size(20, 20);
this.tablica_wynik.Controls.Add(Wy, i, j);
// jak w ogóle to wyswietlic

                    }

                }

// z gory serdeczne Bog zaplac

0

a nie mozesz zrobić tak że,
tworząc textboxy zapisujesz je do 2D tablicy i wtedy nie musisz czarować z GetControlFromPosition

0

obawiam sie ze nie umie ;p poszukam na necie a jak by ci sie nudzilo zapodaj przykladowy kod :) pozd</ort>

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