C#动态创建textBox名称

时间:2012-02-20 18:54:44

标签: c# textbox

我正在尝试动态创建一个textBox名称,因为我有很多这样的名称所以它会更容易写入它们而不是使用循环。我正在使用Visual Stdio 2010,.NET 2.0。下面的代码是我的例子,但我不能让它工作。

private delegate void NameCallBack(string varText, int b);
public void UpdateTextBox(string input, int t)
{
    //TextBox tb = FindControl ("textBox" + t.ToString()) as TextBox;
    TextBox tb = this.Controls["textBox" + t.ToString()] as TextBox;

    if (InvokeRequired)
    {
        tb.BeginInvoke(new NameCallBack(UpdateTextBox), new object[] { input, t });  
    }
    else
    {
        tb.Text = tb.Text + Environment.NewLine + input;
    }
}

我已经看过这里的几个例子和网上的其他资料,但我只是不明白。有人可以指出可能是一个愚蠢的错误吗?非常感谢:))

抱歉,我得到的错误是它没有更新textBox,这实际上并不是一个错误。如果我使用已注释掉的代码,则无法找到“FindControl”方法。我看起来像this.controls,但我很困惑,我已经尝试了很多年,我想我需要休息一下:)

1 个答案:

答案 0 :(得分:0)

我将您的代码复制到示例WinForms项目,它可以正常工作。

您可能已经检查了这一点,但值得一提的是,您希望TextBoxMultiline并在添加实际文字之前添加换行符,所以第一行是空的。 如果TextBox的高度允许它一次只显示一行,则带有文字的行可能不会显示,因此它似乎没有更新。

无论哪种方式,我都对您的代码进行了一些小修改,以便稍微简化一下,而不是在第一次输入之前输入新行:

private delegate void NameCallBack(string varText, int b);
public void UpdateTextBox(string input, int t)
{
    TextBox tb = this.Controls[String.Format("textBox{0}", t)] as TextBox;

    if (InvokeRequired)
    {
        tb.BeginInvoke(new NameCallBack(UpdateTextBox), input, t);
    }
    else
    {
        if (!String.IsNullOrEmpty(tb.Text))
        {
            tb.Text += Environment.NewLine;
        }
        tb.Text += input;
    }
}

似乎有效。

<强>更新

如果这仍然不起作用,问题似乎就在其他地方。 请再次检查您希望文本显示的文本框是否为textBox<x>,其中<x>是相应的数字。

另一件事是确保不抛出任何异常(它们可能会被代码中的其他位置捕获)。要解决所有异常,请转到 调试 例外... ,然后在出现的窗口中选中复选框在与公共语言运行时异常相关联的 Thrown 列中