4

2 つの WinForms アプリケーションがあり、Application2 から Application1 の TextBox にテキストを追加する必要があります。名前付きパイプとWCFを使用してこれを成功させました。Application2 から Application1 のメソッドを正常に呼び出すことができますが、「ウィンドウ ハンドルが作成されるまで、コントロールで Invoke または BeginInvoke を呼び出すことはできません。」というエラーが発生するか、テキスト ボックスがまったく更新されません。

これが私の基本的なコードです。GetMessageApplication2 によって呼び出されます。これは 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);
}

私は何をすべきか?

4

1 に答える 1

2

この回答のおかげで問題が解決しました。

問題は、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;
}

それは今正しく動作します..

于 2012-04-17T12:20:11.913 に答える