Windows Forms - ilość TextBox'ów

1

Jak mogę zrobić, żeby wyświetliło się pod sobą x TextBoxów, gdzie x jest podawane na samej górze do TextBoxu? Czyli mam na górze TextBox, do którego trzeba wpisać jakąś liczbę naturalną. A poniżej pojawi się tyle textboxów ile wynosi liczba x. Prosze o pomoc :D

0

W wpf byłoby (w windows forms pewnie jednakowo albo bardzo podobnie -> może się przyda)

xaml
<TextBox OnTextChanged="AddTextBoxes"/>
<Grid x:Name="grid" />
code
void AddTextBoxes(sender, event)
{
	int count = Convert.ToInt32(((TextBox)sender).Text);
	for (int i = 0;i<count;i++)
	{
		TextBox tb = new TextBox();
		grid.Children.Add(tb);
	}
}
0
        List<TextBox> textBoxes = new List<TextBox>();

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            foreach(TextBox tb in textBoxes) // usuwamy stare textboxy
            {
                tb.Dispose();
            }

            var textBox = (TextBox)sender;

            uint count;
            if (uint.TryParse(textBox.Text, out count))
            {
                for (int i = 0; i < count; i++)
                {
                    var tb = new TextBox();
                    tb.Parent = this;
                    tb.Location = new Point(textBox.Location.X, textBox.Location.Y + tb.Size.Height * (i+1));
                    textBoxes.Add(tb);
                }
            }
            else
            {
                MessageBox.Show("Musisz podać liczbę naturalną");
            }
        }
0

To nie jest takie proste :) Dlaczego ?

Zaraz pojawi się pytanie jak pobierać wartości z takich textbox-ów, jak je pozycjonować. Jak usunąć istniejące textboxy gdy użytkownik podał inną wartość.

Ogólnie sugeruje dodać jakiś listbox/datagrid do którego będziesz dodawać wartości z pojedynczego textbox-a. Zarządzanie widokiem z poziomu code behind to tragiczny pomysł.

Pozdrawiam

3

Aby ułatwić sobie układanie TextBoxów w kolumnie można użyć kontenera TableLayoutPanel.

teo215 napisał(a):

Zarządzanie widokiem z poziomu code behind to tragiczny pomysł.

Ale code behind służy właśnie do tego i tylko do tego.

1

@somekind no dokładnie. Tak może zrobić:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Program {
    class Program {
        static void Main(string[] args) {
            var form = new Form();
            var layout = new TableLayoutPanel();
            layout.Dock = DockStyle.Fill;

            var counter = new TextBox();
            layout.Controls.Add(counter);
            form.Controls.Add(layout);

            counter.KeyPress += (sender, e) => {
                if (e.KeyChar == (char)Keys.Return) {
                    try {
                        int count = Int32.Parse(counter.Text);
                        for (int i = 0; i < count; i++)
                            layout.Controls.Add(new TextBox());
                    }
                    catch (FormatException) {
                        MessageBox.Show("Please type a valid number!");
                        counter.Text = "";
                    }
                }
            };
            
            form.ShowDialog();
        }
    }
}

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