Windows窗体按给定值动态生成文本框

时间:2013-03-16 09:47:46

标签: c# windows winforms matrix textbox

我要做的是,例如,如果我将{5}传递给matrSize那么它必须生成25个名为MatrixNode [11]的文本框,... MatrixNode [12] ......(就像矩阵一样)在数学上)像这样

enter image description here

文本框只会获取矩阵元素,但默认情况下,随机值将在文本框创建后立即填充。

 public partial class Form2 : Form
    {
        public Form2(int matrSize)
        {
            InitializeComponent();
            int counter=0;
            TextBox[] MatrixNodes = new TextBox[matrSize*matrSize];
            for (int i = 0; i < matrSize; i++)
            {
                for (int j = 0; j < matrSize; j++)
                {
                    var tb = new TextBox();
                    Random r = new Random();
                    int num = r.Next(1, 1000);
                    MatrixNodes[counter] = tb;
                    tb.Name = "Node_" + MatrixNodes[counter];
                    tb.Text = num.ToString();
                    tb.Location = new Point(172, 32 + (i * 28));
                    tb.Visible = true;
                    this.Controls.Add(tb);
                    counter++;
                }
            }
            Debug.Write(counter);
        }

现在的问题是:

  1. 我的函数为所有生成的字段填写相同的数字(不知道原因),实际上它必须是随机的
  2. 外观必须与数学中的矩阵完全相同,我的意思是,例如,如果我们传递值5,则必须有5行和5列文本框。但我只能垂直获得5个文本框。
  3. 提前谢谢。请帮助找出功能

3 个答案:

答案 0 :(得分:3)

  1. 您正在为每次迭代创建一个Random的新实例,这些实例非常接近,这就是值相同的原因。在外部for周期之前创建一个实例,然后在里面调用Next()

  2. 您的所有Point个实例都具有相同的水平位置172,因此您的所有列都会重叠。您需要使用j变量调整X,例如Point(172 + (j * 28), 32 + (i * 28))

答案 1 :(得分:0)

问题2:

您将文本框位置设置为:

tb.Location = new Point(172, 32 + (i * 28)

并且永远不会更改X坐标(172),因此您只能获得一列。

答案 2 :(得分:0)

private void button1_Click(object sender, EventArgs e)
{
    int matrSize = 4;
    int counter = 0;
    TextBox[] MatrixNodes = new TextBox[matrSize * matrSize];

    for (int i = 0; i < matrSize; i++)
    {
        for (int j = 0; j < matrSize; j++)
        {
            var tb = new TextBox();
            Random r = new Random();
            int num = r.Next(1, 1000);
            MatrixNodes[counter] = tb;
            tb.Name = "Node_" + MatrixNodes[counter];
            tb.Text = num.ToString();
            tb.Location = new Point(172 + (j * 150), 32 + (i * 50));
            tb.Visible = true;
            this.Controls.Add(tb);
            counter++;
        }

        counter = 0;
    }
}