Как назначить обработчик событий в winfowms с помощью пользовательского ShowDialog?

У меня есть ShowDialog, который принимает несколько параметров. Есть ли способ также передать ему делегат для обработки события в родительской форме? (В отличие от создания экземпляра диалогового окна, затем добавления события, а затем вызова 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()?


person cabgef    schedule 24.08.2010    source источник


Ответы (2)


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

person Hans Passant    schedule 24.08.2010

Вы можете назначать события и обработчики событий по своему усмотрению. Вот пример кода. Есть две формы, каждая с кнопкой и меткой. В 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 вместо этого, поэтому вам потребуется вставить код, чтобы гарантировать, что диалог остается модальным.

person ChrisBD    schedule 25.08.2010