2011-12-24 5 views
2

可能でしょうか?私はここForm1_FormClosingを呼び出す必要があります:コントロールを使用してフォームからイベントを呼び出す方法(たとえば、ボタン)?

ContextMenu trayMenu = new ContextMenu(); 
trayMenu.MenuItems.Add("Close", delegate { 
    Form1_FormClosing(????) 
}); 

私がイベントを_FormClosingからCancelEventArgsを使用していますので、私はそれを必要とする:

private void Form1_FormClosing(object sender, CancelEventArgs e) 
{ 
    if (th != null && th.ThreadState == System.Threading.ThreadState.Running) 
    { 
     if (MessageBox.Show("the process is running, you want stop it?", "app", MessageBoxButtons.OKCancel) == DialogResult.OK) 
     { 
      AbortProccess();      } 
     else 
     { 
      e.Cancel = true; 
     } 
    } 
} 

私は、これは、事前に感謝明らかであると思います。

答えて

4

あなたができることはいくつかあります。 最初にmyForm.Close()を使用してフォームを閉じることができます。これは間接的にFormClosingイベントを呼び出すためです。また、FormClosingイベント内のすべてを、イベント自体ではなく別のメソッドに移動することもできます。その後、イベントとMenuItemからそのメソッドを呼び出すことができます。あなたがそれらのいずれかを実行したくない場合は、代理人としてこれを使用して試みることができる:

//CancelEventArgs can also take a boolean which dictates if 
//it should be cancelled 
Form1_FormClosing(this, new CancelEventArgs()); 
+2

Form1.Close()はかなり恐ろしいvb.net構文です。 Form1はクラスであり、オブジェクトではありません。 C#では、そのメソッドは静的でなければなりません。そうではない。 –

+0

良い点。私は、インスタンスのCloseメソッドを呼び出すようにコードを変更しました。 – keyboardP

+0

は@HansPassantが述べたように 'Form1'を' this'で使用しています。 – Kakashi

3
ContextMenu trayMenu = new ContextMenu(); 
trayMenu.MenuItems.Add("Close", delegate { 
    this.Close(); 
}); 
+0

downvoteの理由は? –

+0

手がかりがない、あなたの偉大な答えのために上の1つがあります。 –

+0

@fabianhjr:ありがとうございましたが、理由を探していたので、答えを修正することができました。 –

3

これは技術的に可能である、ちょうどOnFormClosing()メソッドを呼び出します。しかし、実際にフォームを閉じるわけではありません。フォームが実際に終了したときにのみ実行してください。実際に閉じていないときにフォームが閉じているとふりをすることは、失望につながるだろう。

代わりに、代わりにClose()メソッドを呼び出します。

関連する問題