0

信じられませんが、これは私の他のアプリケーションでは機能しますが、同様の構造を持つこのアプリケーションでは機能しません。

    public string ListAdd
    {
        set
        {
            if (listView1.InvokeRequired)
            {
                this.Invoke((MethodInvoker)delegate
                {
                    listView1.Items.Add(value);
                });
            }
            else
            {
                listView1.Items.Add(value);
            }
        }
    }

私がそれを呼ぶ方法:

        var formz = Form.ActiveForm as Form1;
        if (formz != null)
            formz.ListAdd = "asdasdasdasd";

TCP経由でパケットを受信する関数から呼び出すと(リストビューに入れたい)、何も起こりませんが、WinSockを初期化する同じクラスで呼び出すと、動作します。

問題はどこにあるのでしょうか?

編集: アプリケーションをデバッグしたところです。formz は呼び出した場所 (受信関数) で null です。なぜそれは null ですが、他の場所ではありませんか?

4

3 に答える 3

2

問題が解決するとは思いませんが、次のパターンを使用して呼び出しを行うことを考えましたか? はるかに読みやすいと思います。この拡張メソッドを作成します。

public static class ControlExtension
{
   public static void ThreadSafeInvoke(this Control control, MethodInvoker method)
   {
      if (control != null)
      {
         if (control.InvokeRequired)
         {
            control.Invoke(method);
         }
         else
         {
            method.Invoke();
         }
      }
   }
}

そして、このようにスレッドセーフなメソッド呼び出しを実行できます。

Form form = new Form();

form.ThreadSafeInvoke(() => form.Text = "ThreadSafeInvoke");

または一度に複数の呼び出し。

form.ThreadSafeInvoke(() =>                 
{
   form.Text = "ThreadSafeInvoke";
   form.Visible = true;
   form.WindowState = FormWindowState.Maximized;
});

アップデート

したがって、問題は明らかにForm.ActiveForm戻ってきてnullいます。

  1. 呼び出しの時点でアクティブなフォームはありません。
  2. スレッドにはアクティブなフォームを取得する権限がありません - MSDNはUIPermissionが必要であると述べています。
于 2009-04-25T13:18:39.930 に答える
1

ActiveForm が null を返す場合、アクティブなフォームがないか、Form1 型ではない可能性があります。「as Form1」を使用しているため、アクティブな Form2 がある場合、formz は null に設定されます。

ActiveForm を呼び出す代わりに、関数に formz を渡すことはできますか?

于 2009-04-25T12:47:21.567 に答える
0

デバッグ モードになっているかどうかを確認します。その場合、返されるアクティブ フォームの値は null になります。

于 2011-06-08T07:26:25.423 に答える