2009-09-18 1 views

ответ

2

подписаться на ваш обработчик событий после создания формы. т.е. использовать + =

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace Craft 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      var f = new Form2();    
      f.FormClosing += ClosingMonitorer; 
      f.Show(); 

      var g = new Form3(); 
      g.FormClosing += ClosingMonitorer; 
      g.Show(); 
     } 

     void ClosingMonitorer(object sender, FormClosingEventArgs e) 
     {    
      MessageBox.Show((sender as Form).Text + " is closing"); 
     } 



    } 
} 

[EDIT: или вы можете использовать методы расширения для упрощения процесса подписки события]

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace Craft 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      var f = new Form2(); 
      f.Show(ClosingMonitorer);    


      var g = new Form3(); 
      g.Show(ClosingMonitorer); 

     } 

     void ClosingMonitorer(object sender, FormClosingEventArgs e) 
     { 
      MessageBox.Show((sender as Form).Text + " is closing"); 
     } 



    } 

    public static class Helper 
    { 
     public static void Show(this Form f, FormClosingEventHandler feh) 
     { 
      f.FormClosing += feh; 
      f.Show(); 
     } 
    } 
} 
+0

Здравствуйте, мне нравится ваше предложение, спасибо. – programmernovice

-2

Существует не так просто, как я знаю, но если вы хотите изучить некоторые новые методы, вы можете сделать это с помощью аспектно-ориентированного программирования.

+0

Расширения объект Form не поможет вам с формами, которые не являются частью вашего приложение (например, OpenFileDialog) – tster

+1

Почему это комментарий к собственному ответу, а не мой? Что касается необходимости справиться с этим делом, пусть автор-автор скажет, что это беспокоит его. Если это так, вы начинаете копаться в фильтрах цикла сообщений, которые будут обрабатывать ваш случай. Но это немного перебор, если вам не нужно обрабатывать каждую маленькую форму, такую ​​как общие диалоги и окна сообщений. –

3

Подкласс Form и в конструкторе подключить некоторую функцию к событию FormClosed? Что-то вроде следующего:

public class MyForm : Form 
{ 
    public MyForm(FormClosedEventHandler handler) : base() 
    { 
     this.FormClosed += handler; 
    } 
} 

А затем просто использовать MyForm вместо Form в качестве BaseClass для всех ваших форм.

EDIT: Если у вас есть некоторые статические функции где-то, что вы хотите использовать в качестве обработчика для всех FormClosed событий, то вы можете использование курса:

public MyForm() : base() 
    { 
     this.FormClosed += Program.MyFormClosedHandler; 
    } 

Но это немного плохо (трудно проверить, см. инъекцию зависимостей), и вы можете использовать цепочку конструкторов для достижения той же самой цели в любом случае.

+0

Привет, хорошее решение, я не знаю, почему он работает для меня, когда я создаю простой пример, но, похоже, он не работает в моем приложении реального мира, вам придется исследовать причину. – programmernovice

+0

Вы изменили все формы в приложении, чтобы использовать 'MyForm' или то, что вы назвали им instaaed из' Form'? –

Смежные вопросы