Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#从运行时生成的文本框中获取文本_C#_String_Controls_System.drawing - Fatal编程技术网

C#从运行时生成的文本框中获取文本

C#从运行时生成的文本框中获取文本,c#,string,controls,system.drawing,C#,String,Controls,System.drawing,你好,我正在制作一个有2个文本框和2个按钮的程序 当我按下add按钮时,它将使用以下代码创建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.Nam

你好,我正在制作一个有2个文本框和2个按钮的程序 当我按下add按钮时,它将使用以下代码创建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\u TEXTBOX\u 1在当前上下文中不存在

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

您需要将变量声明移到
ADD\u ROW\u 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> 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);
 }

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

您需要将变量声明移到
添加行\u单击
事件处理程序之外,以便可以在该块之外访问它

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> 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);
 }
或者,特别是如果你有很多文本框,你可以按照Corak在评论中的建议将它们存储在字典中。

一个简单的解决方案: 例如,创建一个名为“NEW_TB”的私有字段。 在按钮2中,单击(..{string tmpStr=NEW_TB.Text;} 在添加行中添加单击(..)方法新建\u TB=NAME\u文本框\u 1

如果我对你的问题理解正确,这应该行得通。

一个简单的解决方案: 例如,创建一个名为“NEW_TB”的私有字段。 在按钮2中,单击(..{string tmpStr=NEW_TB.Text;} 在添加行中添加单击(..)方法新建\u TB=NAME\u文本框\u 1


如果我没弄错你的问题,这应该行。

你在ADD\u ROW\u Click方法中声明NAME\u TEXTBOX\u 1,这就是button2\u Cick方法中不可用的原因

您可以在类级别声明textbox以在两个位置访问它


(你也应该重新命名你的变量-例如TextBoxPrice)

你在ADD\u ROW\u Click方法中声明NAME\u TEXTBOX\u 1,这就是button2\u Cick方法中不可用的原因

您可以在类级别声明textbox以在两个位置访问它


(你也应该重新命名你的变量-例如TextBoxPrice)

使全局成为你的
文本框:

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

NEW_TEXTBOX_1 = new TextBox();

将全局设置为您的
文本框

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

NEW_TEXTBOX_1 = new TextBox();

天哪,别介意抱歉,伙计们,我找到了一个好办法:D

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

这很有效:)

天哪,别介意抱歉,伙计们,我找到了一个好办法:D

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

这非常有效:)

您可以循环查看
This.Controls
中的所有项目,以找到具有所需名称的项目。或者有一个单独的
字典
,其中保存对新创建的文本框的引用,以便于访问。您可以循环浏览
此控件中的所有项。控件
以查找具有所需名称的项。或者有一个单独的
字典
,其中保存对新创建的文本框的引用,以便于访问。如果要创建未知数量的文本框,则动态性不是很强。@Corak则最好使用
文本框
类型的
列表
,但是,根据给定的代码,这一次是一个很好的解决方案。如果您想创建未知数量的文本框,则不是很动态。@Corak然后选择类型为
Textbox
列表
,但是根据给定的代码,这一次是一个很好的解决方案。基本上,但我会使用
字典
按名称访问。基本上是这样,但我会使用
字典
按名称访问。方法很好,但像这样访问数组时要小心。如果没有名为“PRICE\u textbox\u 1
”的文本框,您将得到一个
索引autofrangeexception
。在设置
Text
属性之前,只需检查数组长度是否大于
0`即可。这个方法很好,但访问数组时要小心。如果没有名为“PRICE\u textbox\u 1
”的文本框,您将得到一个
索引AutoFrangeException
。在设置
Text
属性之前,只需检查数组长度是否大于
0`。