2011-01-06 13 views
1

フォームクラス(およびそのデザイナークラス)と静的クラスを含むWindowsフォームアプリケーションがあります。静的クラスからフォームクラスのメソッドを呼び出すことによってフォームを非表示にしたいと考えています。次のように静的コンテキストでWindowsフォームフォームを非表示にする方法

非表示方法は次のとおりです。

internal static void HideController() 
    { 
     DialogResult dlgResult = 
      MessageBox.Show("Controller will now close.", "Closing...", 
          MessageBoxButtons.OK, MessageBoxIcon.Warning); 

     if (dlgResult == DialogResult.OK) 
     { 
      this.Hide(); 
     } 
    } 

フォームは、したがって、私は「これは」静的コンテキストでは有効でないという問題に走り続ける、静的ではありません。私はこのようにメソッドを呼びたいと思います:

static UtilScenario() 
    { 
     _stkProgramId = ConfigurationManager.AppSettings.Get("stkProgramId"); 

     if (CheckIfLaunched()) 
     { 
      InitAllFields(); 
     } 
     else 
     { 
      frmUavController.HideController(); 
     } 
    } 

どうすればいいですか?

+0

HideControllerメソッドからstatic修飾子を削除し、その後、あなたは 'this'キーワードを使用することができます。 – Josh

+0

@Josh Einstein、はい、しかし、メソッドを静的に呼び出すにはどうしたらいいですか?すでにインスタンス化されたフォームオブジェクトを参照したいと思います。 – wulfgarpro

+0

あなたの例では、静的に呼び出すようには見えません。とにかく、可能であれば、何かのインスタンスに作用する静的メソッドの使用を避けてください。それが不可能な場合は、SOで "Singleton"デザインパターンについての情報を調べてください。 – Josh

答えて

2

静的なプロパティForm.ActiveFormを使用すると、フォームへの参照を取得できます。 HideControllerメソッドを呼び出すには、それをfrmUavControllerにキャストする必要があります(static修飾子を削除した後)。

internal void HideController() 
{ 
    DialogResult dlgResult = MessageBox.Show("Controller will now close.", "Closing...", 
     MessageBoxButtons.OK, MessageBoxIcon.Warning); 

    if (dlgResult == DialogResult.OK) 
    { 
     this.Hide(); 
    } 
} 

static UtilScenario() 
{ 
    _stkProgramId = ConfigurationManager.AppSettings.Get("stkProgramId"); 

    if (CheckIfLaunched()) 
    { 
     InitAllFields(); 
    } 
    else 
    { 
     // a safer cast is recommended 
     ((frmUavController)Form.ActiveForm).HideController(); 
    } 
} 
+0

なぜキャストは安全でないのですか? – wulfgarpro

+0

Form.ActiveFormが実際にfrmUavControllerであるかどうかをチェックする必要があることを彼は指摘していると思います。それ以外の場合は、実行時にCastExceptionsになる可能性があります。 –

+0

@WolfgarProキャストが有効であるかどうか、エラー処理があるかどうかを確認するために型チェックは行われません。より多くのフォームを追加する場合は、その保護機能を追加することをおすすめします。 –

0

以下を試してください。プロパティを作成し、

public static Form frm { get; set; } 

static void UtilScenario() 
{ 
    HideController(); 
} 

internal static void HideController() 
{ 
    if (frm == null) 
     return; 
    DialogResult dlgResult = MessageBox.Show("Controller will now close.", "Closing...", 
     MessageBoxButtons.OK, MessageBoxIcon.Warning); 

    if (dlgResult == DialogResult.OK) 
    { 
     frm.Hide(); 
    } 
} 

そして、あなたが好きそれを呼び出すことができます。

public void button2_Click(object sender, EventArgs e) 
{ 
    Form1.frm = this; 
    Form1.HideController(); 
} 
+0

HideControllerは、フォームクラスではなく静的クラスで呼び出されます。フォームクラスは静的ではありません。 – wulfgarpro

+0

編集したコードを確認する – Binil

関連する問題