Tworzenie nowych TextBoxów dynamicznie

Tworzenie nowych TextBoxów dynamicznie
MC
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:45
0

Witam mam mały problem a mianowicie chodzi o to żeby dać użytkownikowi możliwość wpisania cyfry do textbox'a i po czym zostanie utworzona odpowiednia ilość TextBox'ów w odnisieniu do podanej liczby...

Mam taki kod ale program mi się wywala gdzieś przy podaniu lokalizacji ale nie wiem też czy reszta jest dobrze, w każdym bądz razie nie wyskakuje mi żaden błąd...

Kopiuj
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TextBoxy
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private System.Windows.Forms.TextBox[] textboxy;

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            textboxy = new System.Windows.Forms.TextBox[2];
            int ntb = 0;
            foreach (System.Windows.Forms.TextBox textbox in textboxy)
            {
                textbox.Location = new System.Drawing.Point(12, 30);
                textbox.Name = "textbox" + ntb.ToString();
                textbox.Size = new System.Drawing.Size(100, 20);
                textbox.TabIndex = ntb;
                textbox.Visible = true;
                ntb ++;

            }
        }
    }
} 

Z góry dzięki za odpowiedz

0

Może posłuż się właściwościami Left i Top

i Width i Height.
I dodatkowo trzeba gdzieś TextBox dodać.
this.Controls.Add(...);

xeo545x39
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Kosmos
  • Postów:1571
0

Aplikacja wywala się, bo ty tak naprawdę stworzyłeś tylko tablicę bez ustalonych jej elementów. Przez to każdy element tablicy jest null'em i nie możesz mu nic zmienić. Musisz stworzyć każdy TextBox oddzielnie, zamiast twojego foreach'a daj:

Kopiuj
for (int i = 0; i < textboxy.Length; i++)
{
	textboxy[i] = new TextBox();

	textboxy[i].Location = new System.Drawing.Point(12, 30);
	textboxy[i].Name = "textbox" + ntb.ToString();
	textboxy[i].Size = new System.Drawing.Size(100, 20);
	textboxy[i].TabIndex = ntb;
	textboxy[i].Visible = true;

	this.Controls.Add(textboxy[i]);
}

Wypadało by jeszcze ustalać pozycję dla każdego TextBox'a, bo tak to będą się na siebie nakładały.


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
edytowany 3x, ostatnio: xeo545x39
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 dni
  • Lokalizacja:Wrocław
0

Albo użyć TableLayoutPanel, on sam rozmieści nowe TextBoxy.

MC
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:45
0

Panowie dzięki bardzo, rewelacja wszystko działa tylko faktycznie TextBoxy się nakładają na siebie... I tu też moje pytanie jak użyć tego TableLayoutPanel bo nie jestem zbyt biegły w C#...

Bo może powiem o co chodzi dokładnie, chcę dać użytkownikowi możliwość wpisania w TextBox stopień wielomianu po czym powinna wyskoczyć odpowiednia ilość TextBox'ów w które bedzie mógł wprowadzić wartości każdego z wielomianów...

Zastanawiam się jeszcze czy będę mógł dokonać jakiś działań na tych nowo powstałych TextBox'ach jeśli tak to jak je zdefiniować, czy normalnie jako TextBox2, 3 i 4...?
Bo nie do końca będzie wiadoma ich ilość więc też bym musiał zrobić jakąś pętlę żeby je odpowiednio nazywał i pobierał z nich podane wartości...

xeo545x39
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Kosmos
  • Postów:1571
0

Pokombinuj z tym TableLayoutPanel. W kodzie musisz zmieniać jego ilość kolumn/wierszy w zależności i ile będziesz miał TextBox'ów. Do odszukania danej wartości danego TextBox'a możesz użyć:

Kopiuj
this.Controls.Find("TextBox" + licznik.ToString(), false)[0].Text;

Ta metoda zwraca tablicę odnalezionych kontrolek o danej nazwie. I bierzesz pierwszą taką kontrolkę (jedyna taka) i pobierasz jej wartość Text. licznik to licznik twojej pętli gdzie będziesz pobierał ze wszystkich TextBox'ów wartości, zależy ile będziesz ich tam miał.


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
MC
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:45
0

Staram się bawić tym TableLayoutPanel, mianowicie podzieliłem go na jedną kolumnę i 25 wierszy i teraz zastanawiam się jak wprowadzić kod do niego żeby z automatu wszystkie TextBox'y miały tę sam rozmiar i dodawały się jeden pod drugim...
Aha i macie może pomysł jak ograniczyć użytkownikowi wprowadzenie większej liczby TextBox'ów niż 25 myślałem o jakimś wyskakującym MessageBox'ie...

Kopiuj
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TextBoxy
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private System.Windows.Forms.TextBox[] textboxy;

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            textboxy = new System.Windows.Forms.TextBox[2];
            int ntb = 0;
            for (int i = 0; i < textboxy.Length; i++)
            {
                textboxy[i] = new TextBox();


                textboxy[i].Location = new System.Drawing.Point(200, 12);
                textboxy[i].Name = "textbox" + ntb.ToString();
                textboxy[i].Size = new System.Drawing.Size(100, 20);
                textboxy[i].TabIndex = ntb;
                textboxy[i].Visible = true;

                this.Controls.Add(textboxy[i]);
              
            }
        }

        private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
        {

        }
    }
}
xeo545x39
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Kosmos
  • Postów:1571
1

Co do limitu 25 TextBox'ów: po zatwierdzeniu ilości nowych kontrolek wywołujesz funkcję, która zajmuje się ich tworzeniem. Na jej początku sprawdzasz ile kontrolek wpisał użytkownik (możesz przekazać przez parametr), jeżeli > 25 to wyświetlasz mbox'a i zwracasz wynik np. -1 (wychodzisz z funkcji). A co do TableLayoutPanel'a zaraz coś u siebie popróbuję i jak coś podam ci koncepcję.

Tak jak myślałem nie trzeba nic kombinować. Dajesz TableLayoutPanel ustawiasz, odpowiednią ilość kolumn i wierszy, a w funkcji dodającej TextBox'y wklepujesz:

Kopiuj
tableLayoutPanel1.Controls.Add(textBox1);

Automatem ci się będzie dodawał przekazany TextBox do tabeli. I tak robisz z każdym kolejnym, inicjalizując jego właściwości wg swoich potrzeb.


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
edytowany 1x, ostatnio: xeo545x39
MC
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:45
0

Dzięki Wielkie za pomoc... naprawdę mega mi pomagacie... Jeszcze raz dzięki bardzo...

Natomiast co do kodu to wywala mi błąd w tym miejscu "tableLayoutPanel1.Controls.Add(textboxy);" chociaż nie wiem czemu O_o ??

Kopiuj
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            textboxy = new System.Windows.Forms.TextBox[2];
            int ntb = 0;
            for (int i = 0; i < textboxy.Length; i++)
            {
                textboxy[i] = new TextBox();


                textboxy[i].Location = new System.Drawing.Point(200, 12);
                textboxy[i].Name = "textbox" + ntb.ToString();
                textboxy[i].Size = new System.Drawing.Size(100, 20);
                textboxy[i].TabIndex = ntb;
                textboxy[i].Visible = true;

                this.Controls.Add(textboxy[i]);
              
            }

            tableLayoutPanel1.Controls.Add(textboxy);
        }

A co do przekazywania parametru to rozumiem że ma być typu wartościowego, ale mam mały problem z napisaniem tego kodu bo wywala mi się od razu...
Jeżeli mam już textBox1 bo jest to ten w którym użytkownik może wpisać ilość nowo tworzonych textBox'ów to następne numeruje np. textBox2... itd. ?

SI
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 3 lata
0
mcshow napisał(a)

wywala mi błąd w tym miejscu "tableLayoutPanel1.Controls.Add(textboxy);"

Dlatego że próbujesz dodać tablicę kontrolek, zamiast jednej kontrolki. Powinno być tak:

Kopiuj
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            textboxy = new System.Windows.Forms.TextBox[2];
            int ntb = 0;
            for (int i = 0; i < textboxy.Length; i++)
            {
                textboxy[i] = new TextBox();
                textboxy[i].Location = new System.Drawing.Point(200, 12);
                textboxy[i].Name = "textbox" + ntb.ToString();
                textboxy[i].Size = new System.Drawing.Size(100, 20);
                textboxy[i].TabIndex = ntb;

                tableLayoutPanel1.Controls.Add(textboxy[i]);              
            }
        }
MC
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:45
0

Po zmianie pokazuje mi że "i" nie istnieje ??

Dobra już wiem nie w tym miejscu wywołałem tą funkcję :P

Wszystko działa tylko teraz jak przechwycić wartość z nowo powstałych textBox'ów ? Bo rozumiem że każdy stworzony ma kolejne nazwy czyli textBox2 itd...?

edytowany 1x, ostatnio: mcshow
SI
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 3 lata
0

Kilka postów wyżej Xeo napisał Ci już jak dostać się do takiego textboxa.

MC
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:45
0

Pytanie w którym miejscu programu wstawić podany przez Xeo kod żeby dobrze zadziałał...?

Kopiuj
this.Controls.Find("TextBox" + licznik.ToString(), false)[0].Text;

Ta metoda zwraca tablicę odnalezionych kontrolek o danej nazwie. I bierzesz pierwszą taką kontrolkę (jedyna taka) i pobierasz jej wartość Text. licznik to licznik** twojej pętli gdzie będziesz pobierał ze wszystkich TextBox'ów wartości**, zależy ile będziesz ich tam miał.

I właśnie co do tej pętli to ma być wartość pobierana przez parametr ? Tylko jak taką pętlę zainicjować ?

xeo545x39
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Kosmos
  • Postów:1571
0

Jak chcesz jeden TextBox konkretny odnaleźć to wywołujesz tą metodę Find(...) podając jej nazwę chcianej kontrolki + jej numer np. "TextBox1". I za metodą pobierasz pierwszy element wygenerowanej tablicy znalezionych kontrolek, czyli na ten twój znaleziony TextBox.

Jeżeli chcesz od razu pobrać ze wszystkich utworzonych TextBox'ów pobrać jakieś właściwości to robisz pętlę i po kolei podobnie jak przy jednym:

Kopiuj
for (int i = 0; i < zmienna_przechowujaca_ilosc_textbox; i++)
    this.Controls.Find("TextBox" + licznik.ToString(), false)[i].Text; // ta wartość możesz zapisać gdzieś sobie do innej zmiennej

Można na drugi sposób. Wrzucasz każdy dodany TextBox na listę i wtedy, tylko pętlę foreach:

Kopiuj
foreach (TextBox aktualny in lista_textbox)
    aktualny.Text;

Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
edytowany 1x, ostatnio: xeo545x39
MC
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:45
0

Dzięki wielkie...

Znalazłem mały błąd we wcześniejszym kodzie:

Kopiuj
         private void textBox1_TextChanged(object sender, EventArgs e)
        {
            int ntb = 0;
            textboxy = new System.Windows.Forms.TextBox[3];
            for (int i = 0; i < textboxy.Length; i++)
            {
                textboxy[i] = new TextBox();


                textboxy[i].Location = new System.Drawing.Point(200, 12);
                textboxy[i].Name = "TextBox" + ntb.ToString();
                textboxy[i].Size = new System.Drawing.Size(100, 20);
                textboxy[i].TabIndex = ntb;
                textboxy[i].Visible = true;

                this.Controls.Add(textboxy[i]);

                tableLayoutPanel1.Controls.Add(textboxy[i]);
            }

        } 

Chodzi dokładnie o ten moment

Kopiuj
  textboxy = new System.Windows.Forms.TextBox[3]; 

Gdy wpiszę w TextBox1 ilość nowych TextBox'ów i nie ważne czy to będzie 8 czy 24 i tak zawsze wyskakują 3... Domyślam się co jest źle bo chyba to wynika z tablicy którą tworzę o wartości [3] i zawsze będę miał 3 nowe TextBox'y...
Jak to zmienić żeby wartość nowych TextBox'ów równała się temu co wpiszę użytkownik ???

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 dni
  • Lokalizacja:Wrocław
0

Zadeklaruj List<TextBox> textboxy będzie typu, a nie TextBox[] textboxy;

MC
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:45
0
Kopiuj
         __private List<TextBox> textboxy;__

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            int ntb = 0;
           __ **textboxy = new List<TextBox> textboxy;**__
            **__for (int i = 0; i < textboxy.Length; i++)__**
            {
                textboxy[i] = new TextBox();


                textboxy[i].Location = new System.Drawing.Point(200, 12);
                textboxy[i].Name = "TextBox" + ntb.ToString();
                textboxy[i].Size = new System.Drawing.Size(100, 20);
                textboxy[i].TabIndex = ntb;
                textboxy[i].Visible = true;

                this.Controls.Add(textboxy[i]);

                tableLayoutPanel1.Controls.Add(textboxy[i]);
            }

        }

Wyskakuje mi teraz coś takiego:

1: Only assignment, call, increment, decrement, and new object expressions can be used as a statement C:\Users\Sebastian\Documents\Visual Studio 2010\Projects\TextBoxy\TextBoxy\Form1.cs

2: A new expression requires (), [], or {} after type C:\Users\Sebastian\Documents\Visual Studio 2010\Projects\TextBoxy\TextBoxy\Form1.cs

3: 'System.Collections.Generic.List<System.Windows.Forms.TextBox>' does not contain a definition for 'Length' and no extension method 'Length' accepting a first argument of type 'System.Collections.Generic.List<System.Windows.Forms.TextBox>' could be found (are you missing a using directive or an assembly reference?) C:\Users\Sebastian\Documents\Visual Studio 2010\Projects\TextBoxy\TextBoxy\Form1.cs

MC
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:45
0
Kopiuj
         __private List<TextBox> textboxy;__

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            int ntb = 0;
           __ **textboxy = new List<TextBox> textboxy;**__
            **__for (int i = 0; i < textboxy.Length; i++)__**
            {
                textboxy[i] = new TextBox();


                textboxy[i].Location = new System.Drawing.Point(200, 12);
                textboxy[i].Name = "TextBox" + ntb.ToString();
                textboxy[i].Size = new System.Drawing.Size(100, 20);
                textboxy[i].TabIndex = ntb;
                textboxy[i].Visible = true;

                this.Controls.Add(textboxy[i]);

                tableLayoutPanel1.Controls.Add(textboxy[i]);
            }

        }

Wyskakuje mi teraz coś takiego:

1: Only assignment, call, increment, decrement, and new object expressions can be used as a statement C:\Users\Sebastian\Documents\Visual Studio 2010\Projects\TextBoxy\TextBoxy\Form1.cs

2: A new expression requires (), [], or {} after type C:\Users\Sebastian\Documents\Visual Studio 2010\Projects\TextBoxy\TextBoxy\Form1.cs

3: 'System.Collections.Generic.List<System.Windows.Forms.TextBox>' does not contain a definition for 'Length' and no extension method 'Length' accepting a first argument of type 'System.Collections.Generic.List<System.Windows.Forms.TextBox>' could be found (are you missing a using directive or an assembly reference?) C:\Users\Sebastian\Documents\Visual Studio 2010\Projects\TextBoxy\TextBoxy\Form1.cs

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 dni
  • Lokalizacja:Wrocław
0
Kopiuj
textboxy = new List<TextBox>();

To zwykłe utworzenie obiektu, przydatna umiejętność w programowaniu.

edytowany 2x, ostatnio: somekind
MC
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:45
0

Zmieniłem i nadal są błędy czyli 1 i 3 błąd został i pojawił się nowy że gdzieś brakuje ";"

Kopiuj
 ^         private List<TextBox> textboxy;

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            int ntb = 0;
            textboxy = new List<TextBox>() textboxy;
            for (int i = 0; i < textboxy.Length; i++)
            {
                textboxy[i] = new TextBox();


                textboxy[i].Location = new System.Drawing.Point(200, 12);
                textboxy[i].Name = "TextBox" + ntb.ToString();
                textboxy[i].Size = new System.Drawing.Size(100, 20);
                textboxy[i].TabIndex = ntb;
                textboxy[i].Visible = true;

                this.Controls.Add(textboxy[i]);

                tableLayoutPanel1.Controls.Add(textboxy[i]);
            }

        } ^ 

Pokazuje że błędy są gdzieś w tym miejscu kodu

Kopiuj
             int ntb = 0;
            textboxy = new List<TextBox>() textboxy;
            for (int i = 0; i < textboxy.Length; i++) 
0

Litosci...

Po pierwsze:

Kopiuj
 List<TextBox> textboxy = new List<TextBox>();

Po drugie:
RTFM!
List nie ma wlasciwosci Length tylko Count
http://msdn.microsoft.com/en-us/library/27b47ht3.aspx

somekind
Racja, zjeb*** w poprzednim poście, no ale ktoś tu mógłby myśleć nad tym co robi.
MC
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:45
0

Witam

Poprawiłem cały kod i teraz nie pokazuje mi żadnego błędu ale z drugiej strony program też nie działa poprawnie czyli po wpisaniu wartości w TextBox nie wyskakuje odpowiednia ilość nowych TextBox'ów...

Wiecie może gdzie jest błąd...?

Kopiuj
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TextBoxy
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private List<TextBox> textboxy;

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            int ntb = 0;
            textboxy = new List<TextBox>();
            for (int i = 0; i < textboxy.Count; i++)
            {
                textboxy[i] = new TextBox();


                textboxy[i].Location = new System.Drawing.Point(200, 12);
                textboxy[i].Name = "TextBox" + ntb.ToString();
                textboxy[i].Size = new System.Drawing.Size(100, 20);
                textboxy[i].TabIndex = ntb;
                textboxy[i].Visible = true;

                this.Controls.Add(textboxy[i]);

                tableLayoutPanel1.Controls.Add(textboxy[i]);
            }

        }

        private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
        {
    
        }
    }
}

 
siararadek
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 9 lat
1

Ban na debugger? Zobacz jaką wartość ma textboxy.Count

xeo545x39
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Kosmos
  • Postów:1571
1

Ta pętla jest zła: for (int i = 0; i < textboxy.Count; i++). Tutaj textboxy.Count będzie mieć 0, więc żadnych textboxów nie będzie. Najpierw musisz zdefiniować ile tych textboxów chcesz i tyle wykonać razy obrót pętlą, dopiero po utworzeniu takiego textboxa wrzucasz go do listy, aby mieć do nich dostęp później.

Tak w ogóle, źle to robisz, lista sama w sobie nie ma obiektów, więc nie możesz zrobić tak textboxy[i] zanim nie dodasz elementów do niej.

Kopiuj
private List<TextBox> textboxy;
 
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            int ntb = 0;
            textboxy = new List<TextBox>();
            for (int i = 0; i < int.Parse(textbox1.Text); i++)
            {
                TextBox textbox = new TextBox();
 
                textbox.Location = new System.Drawing.Point(200, 12);
                textbox.Name = "TextBox" + ntb.ToString();
                textbox.Size = new System.Drawing.Size(100, 20);
                textbox.TabIndex = ntb;
                textbox.Visible = true;
 
                //this.Controls.Add(textbox); // to jest zbędne, jak dodajesz to tableLayoutPanel, to już nie musisz na formę
                textboxy.Add(textbox);

                tableLayoutPanel1.Controls.Add(textbox);
            }
 
        }

Mniej więcej o to mi chodzi.


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
edytowany 2x, ostatnio: xeo545x39
MC
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:45
0

Rewelacja ! Dzięki bardzo, tylko teraz jest problem bo wartość do textBox'a można wprowadzić raz bo po usunięciu i podaniu ponownie program się wywala...

Idzie jakoś temu zaradzić ?

A przy okazji jak ograniczyć wprowadzenie więcej niż powiedzmy 25 nowych textBox'ów ?

Coś na zasadzie if (i > 25) {messageBox.Show ("zbyt duża wartość")...? }

edytowany 1x, ostatnio: mcshow
xeo545x39
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Kosmos
  • Postów:1571
0

Ja bym ci radził nie robić tego w evencie onTextChange tylko np. po naciśnięciu klawisz albo przycisku, bo tak po wprowadzeniu liczby np. 11, zrobią się najpierw jeden, a potem 11. A dokładnie w którym miejscu się wywala, prześledź działanie programu debugger'em.


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
MC
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:45
0

Wywala się gdzieś w tym miejscu

Kopiuj
  for (   int i = 0; i < int.Parse(textBox1.Text); i++) 

ale chyba masz rację zrobię przycisk umożliwiający potwierdzenie danej wartości i kasujący nowo powstałe textBox'y...

0
mcshow napisał(a)

Wywala się gdzieś w tym miejscu

Kopiuj
  for (   int i = 0; i < int.Parse(textBox1.Text); i++) 

ale chyba masz rację zrobię przycisk umożliwiający potwierdzenie danej wartości i kasujący nowo powstałe textBox'y...

Wywala sie w tym miejscu bo textBox1.Text jest rowne string.Empty a tego sie nie da sparsowac na int.

Szarp
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:48
0

A mi się z tym kodem nic nie wywala.

Ino

Kopiuj
int.Parse(textbox1.Text)

trzeba zamienić na:

Kopiuj
int.Parse(textBox1.Text)

:)

btw

Kopiuj
textbox.Name = "TextBox" + ntb.ToString();

Tworzycie textboxy o tej samej nazwie? :P

Kopiuj
    public partial class Form1 : Form
    {
        private const int iHEIGHT = 20, iWIDTH = 100;
        private const int iCOLS = 5, iROWS = 2;
        private List<TextBox> tbList = new List<TextBox>();

        public Form1()
        {
            InitializeComponent();

            tableLayoutPanel1.ColumnCount = iCOLS;

            for (int i = 0; i < tableLayoutPanel1.ColumnStyles.Count; i++)
            {
                tableLayoutPanel1.ColumnStyles[i].SizeType = SizeType.Absolute;
                tableLayoutPanel1.ColumnStyles[i].Width = iWIDTH + 4;
            }

            tableLayoutPanel1.RowCount = iROWS;

            for (int i = 0; i < tableLayoutPanel1.RowStyles.Count; i++)
            {
                tableLayoutPanel1.RowStyles[i].SizeType = SizeType.Absolute;
                tableLayoutPanel1.RowStyles[i].Height = iHEIGHT + 4;
            }

            tableLayoutPanel1.Height = iROWS * (iHEIGHT + 4);
            tableLayoutPanel1.Width = iCOLS * (iWIDTH + 4);
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            int ntb = 0;
            Int32.TryParse(textBox1.Text, out ntb);

            if (ntb > tbList.Count)
            {
                tableLayoutPanel1.RowCount = (ntb < iROWS) ? iROWS : ntb;
                tableLayoutPanel1.Height = (iHEIGHT + 4) * tableLayoutPanel1.RowCount;

                for (int i = tbList.Count; i < ntb; i++)
                {
                    tbList.Add(new TextBox());

                    tbList[i].Location = new System.Drawing.Point(0, 0);
                    tbList[i].Name = String.Format("{0}{1}", "tbTest", i);
                    tbList[i].Size = new System.Drawing.Size(iWIDTH, iHEIGHT);
                    tbList[i].TabIndex = i;
                    tbList[i].Visible = true;

                    tableLayoutPanel1.Controls.Add(tbList[i]);
                }
            }
        }
    }

Zmień sobie nazwy: Form1, textBox1 i tableLayoutPanel1 na bardziej konkretniejsze ;d


Moonless Sky
Becoming the Getsuga itself.
edytowany 3x, ostatnio: Szarp
xeo545x39
Autor chyba zapomniał inkrementować ntb ;p
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)