3

これを行う方法がわかりません。ここにサンプルコードがあります。私がやりたいことの。

public Class MainForm : Form
{
    MyUserControl MyControl = new MyUserControl;
    private void Button_Click(object sender, EventArgs e)
    {
        //Create MyEvent
    }    
}

public Class MyUserControl : UserControl
{
    //listen for MyEvent from MainForm, and perform MyMethod
    public void MyMethod()
    {
         //Do Stuff here
    }
}
4

3 に答える 3

4

ステップ1)MainFormでイベントを公開します...言います。

public event Action simpleEvent

ステップ2)MyUserControlに、MainFormのインスタンスを取得し、そのイベントにアクションをバインドするコンストラクターを提供します

public MyUserControl(MainForm form) {
    form += () => Console.WriteLine("We're doing something!")
}

ステップ3)MainForm.Button_Clickでイベントを発生させます

if(simpleEvent != null) simpleEvent();

注:独自のデリゲートを登録して、ラムダ式以外のものを操作することができます。より詳細な説明については、http://msdn.microsoft.com/en-us/library/17sde2xt.aspxを参照してください。

最終結果は次のようになります...

public Class MainForm : Form
{
    public event Action MyEvent;

    MyUserControl MyControl = new MyUserControl(this);
    private void Button_Click(object sender, EventArgs e)
    {
        if(simpleEvent != null) simpleEvent();
    }    
}

public Class MyUserControl : UserControl
{
    //listen for MyEvent from MainForm, and perform MyMethod
    public MyUserControl(MainForm form) {
        simpleEvent += () => MyMethod();
    }

    public void MyMethod()
    {
         //Do Stuff here
    }
}
于 2012-05-12T19:18:19.887 に答える
2

これは、外部がそれを聞くことができるように、プライベートメンバーのイベントに委任する方法です。

public event EventHandlerType EventHandlerName
{
    add
    {
        this._privateControl.EventHandlerName += value;
    }
    remove
    {
        this._privateControl.EventHandlerName -= value;            
    }
}

もう1つのオプションは、フォームクラスにイベントを含めることです。

public event EventHandler MyEvent;

そして、プライベートメンバーのイベントを聞いてください:

this._customControl.SomeEvent += this.SomeEventHandler;

これとともに:

private void SomeEventHandler(object sender, EventArgs e)
{
    if (this.MyEvent != null)
    {
        this.MyEvent(this, e);
    }
}

どちらの場合も、外部からの使用法は同じになります。

var form = new Form1();

form1.MyEvent += (o, e) => { Console.WriteLine("Event called!"); };

肝心なのは、外部のサブスクライブ/内部イベントのリッスンを可能にするために、フォーム内に機能を実装する必要があるということです。

于 2012-05-12T19:17:52.827 に答える
1
//listen for MyEvent from MainForm, and perform MyMethod

それは間違った方法です。コントロールでイベントを公開すると便利です。コントロールは、イベントがどのように使用されるかを推測できない可能性があります。ただし、ドロップされる形式で利用できる場合とできない場合があるイベントについては、ほとんどの場合、何も知らないはずです。それは、フォームに(まだ)イベントがないときに爆破するという厄介な習慣があります。悪い種類でもあります。設計時にクラッシュして、ダーンのホワイトスクリーンが表示され、問題を修正できなくなります。

フォームは推測する必要はありません。フォームが持つコントロールを正確に把握しています。したがって、イベントを発生させたい場合は、コントロールのMyMethodメソッドを直接呼び出すだけです。また、コントロールを削除するが呼び出しは削除しないなど、何らかの理由でそれが間違っている場合は、簡単に修正できるコンパイルエラーが発生します。

于 2012-05-12T19:29:17.657 に答える