2010-08-24 2 views
0

У меня есть ShowDialog, который принимает несколько параметров. Есть ли способ передать делегат для обработки события в родительской форме? (В отличие от инстанцировании диалога, а затем добавить событие, то вызов по умолчанию ShowDialog)Как назначить обработчик событий в winfowms с помощью пользовательского ShowDialog?

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

public event NameChangeEventHandler OnChange; 

internal DialogResult ShowDialog(string pPersonName) 
{ 
    using (diagSample dialog = new siagSample(pPersonName) 
    { 
    DialogResult result = dialog.ShowDialog(); 
    return result; 
    } 
} 

public diagSample(string pPersonName) 
{ 
    InitializeComponent(); 
    _PersonName = pPersonName; 
} 

Редактировать: Моя основная цель: у меня есть часто используемый диалог, который нужно вызвать обработчик события в родительской форме, когда поля в диалоговом окне будут изменены. Есть ли способ сделать это, помимо создания экземпляра диалога New() и назначения события его обработчику событий каждый раз перед использованием ShowDialog()?

ответ

1

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

0

Вы можете назначить события и обработчики событий так, как вам нравится. Вот пример кода. Есть две формы, каждая с кнопкой и ярлыком. Form2 имеет текстовое поле, в которое вы можете ввести tesxt. Когда нажата кнопка на Form2, она меняет текст метки и запускает событие, которое выбрано Form1. Метка в Form1 затем изменится так, как в Form2.

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

     private void button1_Click(object sender, EventArgs e) 
     { 
      Form2 dlg = new Form2(); 
      dlg.NameChanged += OnNameChanged; 
      dlg.ShowDialog(); 
     } 

     private void OnNameChanged(object sender, NameChangeEventArgs args) 
     { 
      this.label1.Text=args.NewName; 
     } 
    } 
    public class NameChangeEventArgs : EventArgs 
    { 
     public NameChangeEventArgs(string name) 
     { 
      this.NewName=name; 
     } 
     public string NewName{get;private set;} 
    } 
    public partial class Form2 : Form 
    { 
     public Form2() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      label1.Text = textBox1.Text; 
      if (this.NameChanged != null) 
      { 
       this.NameChanged(this, new NameChangeEventArgs(label1.Text)); 
      } 
     } 

     public event EventHandler<NameChangeEventArgs> NameChanged; 
    } 
} 

редактировать - Жаль, что я не прочитал ваш вопрос правильно.

Если вы хотите, чтобы избежать этого

 Form2 dlg = new Form2(); 
     dlg.NameChanged += OnNameChanged; 
     dlg.ShowDialog(); 

Тогда вы могли бы изменить конструктор Form2 к:

public Form2(EventHandler<NameChangeEventArgs> eventhandler) 
{ 
    InitializeComponent(); 
    NameChanged += eventhandler; 
} 

И затем вы настроите и показать Form2 следующим образом:

Form2 dlg = new Form2(OnNameChanged); 
    dlg.ShowDialog(); 

К сожалению, на данный момент существует способ избежать += в назначении обработчиков событий, поскольку они должны быть назначены после создания родительского класса. Конечно, вы могли бы создать экземпляр диалогового окна один раз и просто не показывать его до тех пор, пока это не понадобится, но тогда вам придется справиться с закрытием и уничтожением диалогового окна, что означает, что вы не используете ShowDialog, но вместо этого показываете Show вместо этого, требуя, чтобы вы вставили код для обеспечения что диалог остается модальным.

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