我有两个WinForms应用程序,我需要从Application2向Application1中的TextBox添加文本.我使用命名管道和WCF成功完成了这项工作.我可以成功地从Application2调用Application1中的方法但是我得到“在创建窗口句柄之前无法在控件上调用Invoke或BeginInvoke.”错误或文本框根本没有更新.
这是我的基本代码. Application2调用GetMessage.这个根本不更新TextBox:
public void GetMessage(string msg)
{
UpdateTextbox(msg);
}
private void UpdateTextbox(string msg)
{
this.textBox1.Text += msg + Environment.NewLine;
}
这个抛出Invoke错误:
public void GetMessage(string msg)
{
Action a = () => UpdateTextbox(msg);
textBox1.BeginInvoke(a);
}
我试图通过强制创建句柄来欺骗我的方式,但它也不会更新TextBox:
public void GetMessage(string msg)
{
IntPtr handle = textBox1.Handle;
Action a = () => UpdateTextbox(msg);
textBox1.BeginInvoke(a);
}
我该怎么办?
最佳答案 由于
this answer解决了这个问题.
问题是Form1的TextBox是在Form1的另一个实例上.从Application1.Form1中观察此代码,它启动命名管道服务:
private void Form1_Load(object sender, EventArgs e)
{
ServiceHost host = new ServiceHost(typeof(Form1), new Uri[] { new Uri("net.pipe://localhost") });
host.AddServiceEndpoint(typeof(ISmsService), new NetNamedPipeBinding(), "PipeReverse");
host.Open();
}
如果我理解正确,这将启动Form1的实例.因此,当Application2调用Application1.GetMessage时,它调用ServiceHost-instance-Form1.GetMessage.
要访问Form1的主实例,我将代码更改为:
public Form1()
{
InitializeComponent();
if (mainForm == null)
{
mainForm = this;
}
}
private static Form1 mainForm;
public static Form1 MainForm
{
get
{
return mainForm;
}
}
private void UpdateTextbox(string msg)
{
MainForm.textBox1.Text += msg + Environment.NewLine;
}
它现在正常工作..