我正在尝试动态创建一个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,但我很困惑,我已经尝试了很多年,我想我需要休息一下:)
答案 0 :(得分:0)
我将您的代码复制到示例WinForms项目,它可以正常工作。
您可能已经检查了这一点,但值得一提的是,您希望TextBox
为Multiline
并在添加实际文字之前添加换行符,所以第一行是空的。
如果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 列中。