0

いくつかのパラメーターを取る 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;
}

編集:私の主な目標は、ダイアログのフィールドが変更されるたびに、親フォームでイベントハンドラーを呼び出す必要がある頻繁に使用されるダイアログがあることです。ShowDialog() を使用する前に、毎回 New() ダイアログをインスタンス化し、そのイベント ハンドラーにイベントを割り当てる以外に、これを行う方法はありますか?

4

2 に答える 2

1

確かに、名前と同じように、デリゲート インスタンスをフォーム コンストラクターで渡すことができます。これを行う利点はありません。コードは、ダイアログ フォームでイベントを宣言する場合と非常によく似ています。ただ非標準。

于 2010-08-24T17:20:43.127 に答える
0

イベントとイベントハンドラーは好きなように割り当てることができます。ここにいくつかのサンプルコードがあります。ボタンとラベルが付いた2つのフォームがあります。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を使用して、コードを配置して、ダイアログはモーダルのままです。

于 2010-08-25T06:40:32.667 に答える