Как назначить обработчик событий в winfowms, используя собственный ShowDialog? - PullRequest
0 голосов
/ 24 августа 2010

У меня есть 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 ()?

Ответы [ 2 ]

1 голос
/ 24 августа 2010

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

0 голосов
/ 25 августа 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;
    }
}

edit - Извините, я не правильно прочитал ваш вопрос.

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

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

...