0

您好,我正在制作一个有 2 个文本框和 2 个按钮的程序当我按下添加按钮时,它将使用以下代码创建 2 个新文本框:

        private void ADD_ROW_Click(object sender, EventArgs e)
    {
        //Make the NEW_TEXTBOX_1
        HOW_FAR += 1;
        TextBox NEW_TEXTBOX_1 = new TextBox();
        NEW_TEXTBOX_1.Name = "NAME_TEXTBOX_" + HOW_FAR.ToString();

        //Set NEW_TEXTBOX_1 font
        NEW_TEXTBOX_1.Font = new Font("Segoe Print", 9);
        NEW_TEXTBOX_1.Font = new Font(NEW_TEXTBOX_1.Font, FontStyle.Bold);

        //Set pos and size and then create it.
        NEW_TEXTBOX_1.Location = new System.Drawing.Point(16, 71 + (35 * HOW_FAR));
        NEW_TEXTBOX_1.Size = new System.Drawing.Size(178, 29);
        this.Controls.Add(NEW_TEXTBOX_1);


        //Make the PRICE_TEXTBOX_
        TextBox NEW_TEXTBOX_2 = new TextBox();
        NEW_TEXTBOX_2.Name = "PRICE_TEXTBOX_" + HOW_FAR.ToString();

        //Set NEW_TEXTBOX font
        NEW_TEXTBOX_2.Font = new Font("Segoe Print", 9);
        NEW_TEXTBOX_2.Font = new Font(NEW_TEXTBOX_2.Font, FontStyle.Bold);

        //Set pos and size and then create it.
        NEW_TEXTBOX_2.Location = new System.Drawing.Point(200, 71 + (35 * HOW_FAR));
        NEW_TEXTBOX_2.Size = new System.Drawing.Size(89, 29);
        this.Controls.Add(NEW_TEXTBOX_2);

        //Change pos of the add button
        ADD_ROW.Location = new System.Drawing.Point(295, 71 + (35 * HOW_FAR));
        this.Height = 349 + (35 * HOW_FAR);
        this.Width = 352;
    }

这很好用,但现在我想从新制作的文本框中取回文本,我该怎么做?

这不起作用,因为它说: NAME_TEXTBOX_1 在当前上下文中不存在。

    private void button2_Click(object sender, EventArgs e)
    {
        string tmpStr = NAME_TEXTBOX_1.Text;
    }
4

5 回答 5

3

您需要将变量声明移到ADD_ROW_Click事件处理程序之外,以便在该块之外可以访问它;

TextBox NEW_TEXTBOX_1;

private void ADD_ROW_Click(object sender, EventArgs e)
{
   //Make the NEW_TEXTBOX_1
   HOW_FAR += 1;
   NEW_TEXTBOX_1 = new TextBox(); //remove "TextBox" since we declared it above
   NEW_TEXTBOX_1.Name = "NAME_TEXTBOX_" + HOW_FAR.ToString();
  //...

另一种方法(可能更好取决于文本框的数量)是将您创建的每个文本框添加到列表中。然后,您可以从中迭代该 List 并找到所需的 TextBox。例如

List<TextBox> allTextBoxes = new List<TextBox>();

private void ADD_ROW_Click(object sender, EventArgs e)
{
   //Make the NEW_TEXTBOX_1
   HOW_FAR += 1;
   TextBox NEW_TEXTBOX_1 = new TextBox(); 
   //...fill out the properties

   //add an identifier
   NEW_TEXTBOX_1.Tag = 1;

   allTextBoxes.Add(NEW_TEXTBOX_1);
 }

然后当你想要一个特定的 TextBox

private void button2_Click(object sender, EventArgs e)
{
    TextBox textBox1 = allTextBoxes.Where(x => x.Tag == 1).FirstOrDefault();
    string tmpStr = "";

    if(textBox1 != null)
       tmpStr = textBox1.Text;
}

或者,特别是如果您将拥有很多文本框,您可以按照 Corak 在评论中的建议将它们存储在字典中。

于 2013-07-04T12:23:46.470 回答
3

您在 ADD_ROW_Click 方法中声明 NAME_TEXTBOX_1,这就是为什么它在 button2_Cick 方法中不可用。

您可以在类级别声明文本框以在两个地方访问它。

(您也应该重命名变量 - 例如 TextBoxPrice)

于 2013-07-04T12:24:08.793 回答
0

OMG 没关系对不起伙计们,我找到了一个好方法:D

        var text = (TextBox)this.Controls.Find("PRICE_TEXTBOX_1", true)[0];
        text.Text = "PRO!";

这工作得很好:)

于 2013-07-04T12:29:49.600 回答
0

一个简单的解决方案:例如,创建一个名为“NEW_TB”的私有字段。在你的 button2_Click(..) { string tmpStr = NEW_TB.Text; 添加您的 ADD_ROW_Click(..) 方法 NEW_TB = NAME_TEXTBOX_1;

如果我理解你的问题是正确的,这应该有效。

于 2013-07-04T12:23:53.047 回答
0

让全球成为你的textboxes

TextBox NEW_TEXTBOX_1;

然后在您的方法中启动它们:

NEW_TEXTBOX_1 = new TextBox();
于 2013-07-04T12:24:53.587 回答