【发布时间】:2014-01-07 08:10:56
【问题描述】:
我有一个表单和另一个类文件,当我单击主表单中的按钮时,它会将值传递给另一个文件中另一个类中的函数(此函数是通用的,由所有文件调用)再次调用主窗体/类中的函数并更新文本框。
我已经编写了代码,但是它抛出异常说“在创建窗口句柄之前不能在控件上调用 Invoke 或 BeginInvoke。”
代码在这里..请纠正错误的地方。 主窗体有按钮和一个文本框。
主要形式
namespace One
{
public partial class Form1 : Form
{
public delegate void WriteToListBoxDelegate(string StringForText);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Class1 c1 = new Class1();
int a = 9;
c1.nnn(a);
}
private void Form1_Load(object sender, EventArgs e)
{
}
public void SetListBox(string StringForText)
{
textBox1.Text += DateTime.UtcNow.ToString("dd-MM-yyyy HH:mm:ss") + ": " + StringForText + '\n' + textBox1.Text;
MessageBox.Show(textBox1.Text);
}
}
}
另一个类文件
namespace One
{
public class Class1
{
public One.Form1 theMDIform = new One.Form1();
public int nnn(int a)
{
theMDIform.Invoke(new Form1.WriteToListBoxDelegate(theMDIform.SetListBox), '1');
return 0;
}
}
}
【问题讨论】:
-
如果我直接从另一个类调用主函数的函数并更新文本框,当类函数的函数控件移回主窗体时,文本框将丢失数据。
-
如果你指出你得到错误的地方会很好......
-
错误出现在以下行:theMDIform.Invoke(new Form1.WriteToListBoxDelegate(theMDIform.SetListBox), '1');
-
这看起来很危险的递归。
-
您还试图在一个尚不存在的窗口上执行一个函数。你知道,就像你的错误所说的那样?你也有一个循环依赖。我建议你重新审视你是如何组织你的代码的。即使现在为您解决了这个错误,但在以后的道路上,您将遇到更多、更大的问题。