【问题标题】:how do you store a dynamical set of textboxs to an array in a c# winform如何将一组动态文本框存储到 c# winform 中的数组中
【发布时间】:2016-10-20 05:09:09
【问题描述】:

我目前正在尝试编写我认为将是一个简单的游戏,因为我已经在非图形环境 (c++) 中完成了它。现在我试图在 c# winform 中重新编程。在我的第一个表单中,用户输入要在 1 到 10 的范围内玩多少玩家。根据用户在第一个表单上的输入,确定在我的第二个表单上将填充多少标签和文本框。

在加载时填充文本框的第二个表单上,我试图将用户或用户放入一个或多个文本框的名称并将它们存储到一个数组中,我可以传递给我的下一个表单并使用轮到播放时显示用户名。

private void playerNames_Load(object sender, EventArgs e)
    {
        string myOnload = null;

        if (myOnload == null)
        {
            TextBox[] textBox = new TextBox[numPlayers];
            Label[] label = new Label[numPlayers];
            int labelX, labelY, textboxX, textboxY;

            labelX = 20;
            labelY = 22;
            textboxX = 70;
            textboxY = 20;

            for (int i = 0; i < numPlayers; i++)
            {
                int labelCTR = i + 1;
                textBox[i] = new TextBox();
                textBox[i].Name = "player" + i;
                textBox[i].Text = "";
                textBox[i].Location = new Point(textboxX, textboxY);

                label[i] = new Label();
                label[i].Name = "player" + i;
                label[i].Text = "Player " + labelCTR;
                label[i].Location = new Point(labelX, labelY);

                labelY += 25;
                textboxY += 25;
            }

            for (int i = 0; i < numPlayers; i++)
            {
                this.Controls.Add(textBox[i]);
                this.Controls.Add(label[i]);
            }
        }
    }

上面的代码是我如何让表单根据用户输入的 numPlayers 变量的值填充文本框。

private void submitPlayers_Click(object sender, EventArgs e)
    {
        string[] name = new string[numPlayers];
        //List<string> name = new List<string>();

        for (int i = 0; i < numPlayers; i++)
        {
            TextBox[] textBox = new TextBox[numPlayers];
            //name[i] = textBox[i].Text; // first try and fail
            name[i] += textBox[i].Text; // my code currently crashes here
            //name.Add(textBox[i].Text); // it also crashes here if i try to switch from array to list


            for (i = 0; i < numPlayers; i++)
            { 
                int m = i+1;
                MessageBox.Show("Player " + m + " " + name[i], "testing");
            }
        }

上面的代码是我试图将文本框转储到一个数组中的地方,以便我可以将它们存储起来以供以后在我的下一个表单中使用。我在最后添加了 messageBox 以尝试通过使其每个 messageBox 转储一个名称来测试数组,直到所有名称都已成功转储。当我终于让它工作时,带有 messageBox 的 for 循环将被替换为打开我的下一个表单并将名称数组传递给它的代码。因此,每个玩家回合都会在表格的标题栏中使用他们的名字更加个性化。

【问题讨论】:

  • 可以使用文本框列表,更简单。

标签: c# arrays winforms


【解决方案1】:

您将文本框设置为循环的本地文本框,因此您无法从第二种方法访问原始文本框(您正在访问尚未填充的新数组)。

这个:

TextBox[] textBox = new TextBox[numPlayers];

声明一个新变量并为其分配一个新数组。

因此,将它们声明为类(例如,您声明numPlayers),而不是方法,并在创建数组时使用:

textBox = new TextBox[numPlayers];

(请注意,我们没有指定类型,所以这里我们将新数组分配给现有变量,而不是声明新变量)

在第二种方法中,只需将声明行全部删除(数组已声明,并且已在第一种方法中创建)


它崩溃的原因是因为你在做:

TextBox[] textBox = new TextBox[numPlayers];
name[i] = textBox[i].Text;

所以你正在分配一个大小为numPlayers的文本框数组,但你并没有自己创建文本框(请注意,在第一种方法中,你正在这样做,通过textBox[i] = new TextBox())......所以当您尝试在第二种方法中访问textBox[i],您正在访问一个未初始化的变量。

【讨论】:

  • 谢谢@Jcl 解决了我的崩溃问题。现在我只需要弄清楚为什么 messageBox 循环只转储名字,就好像数组没有保存其他名字一样。
  • 代码运行而不是崩溃,但是当代码运行 messageBox 循环时,它只转储名字。它继续运行 messageBox 循环并像它应该的那样递增 ` "player" + [i] `,但是 messageBox 行中的 `name[i] ` 部分在第一个之后的每个 messageBox 上都是空白的。
  • @SubZero 哦,我明白了问题...您正在运行消息框循环 inside 另一个循环(并为两者使用相同的变量名:i) .获取 messagebox-showing 循环 outside name-array-filling 循环
  • 我不敢相信我做到了,非常感谢。我整个周末都在绞尽脑汁想弄清楚为什么它不起作用。将该段移到将文本框保存到数组的循环之外后,它的工作原理非常完美。非常感谢你
猜你喜欢
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多