web-dev-qa-db-ja.com

基礎となる制御のイベントの公開

カスタムコントロールにコンボボックスがあります。 SelectedIndexChangedやKeyPressなどの特定のイベントを、カスタムコントロールを実装している人に公開するにはどうすればよいですか?

39
Malfist

次のようにイベントを転送できます。

    public event EventHandler SelectedIndexChanged 
    {
        add { inner.SelectedIndexChanged += value; }
        remove { inner.SelectedIndexChanged -= value; }
    }
80
SLaks

これらを自分でコントロールにコーディングする必要があります。ユーザーコントロールは、子コントロールのイベントを自動的にプロモートしません。次に、実際のコントロールをユーザーコントロールのプロモートイベントに相互接続できます。

        public event EventHandler SelectedIndexChanged;

        private void OnSelectedIndexChanged(object sender, EventArgs e)
        {
            if (SelectedIndexChanged != null)
                SelectedIndexChanged(sender, e);
        }

        public UserControl1()
        {
            InitializeComponent();

            cb.SelectedIndexChanged += new EventHandler(OnSelectedIndexChanged);
        }

残念ながら、興味のあるすべてのイベントに対してこれを行う必要があります。

3

カスタムイベントを使用するのではなく、非常に単純な解決策は、ネストされたコントロールをカスタムコントロールのプロパティとして公開することです。そこから、イベントハンドラーを非常に簡単にアタッチできます。子コントロールを公開することは常に推奨されるわけではありませんが、コントロールの種類とその使用方法によっては、機能する場合があります。

//create an instance of my control
MyCustomControl controlInstance = new MyCustomControl();

//attach and event handler to the exposed subcontrol
controlInstance.SaveButton.Click += new EventHandler(SaveButton_Click);
2
KP.

デザイナーを通じてそれを処理する別の方法があります:

デザイナのカスタムコントロールで、[デザイン]の下のコンボボックスプロパティで[モディファイア]を内部に設定します。

次に、それについて何かをする必要がある場所に追加します:

CustControlName.YourCombo.SelectedIndexChanged += YourCombo_SelectedIndexChanged;

に加えて :

private void YourCombo_SelectedIndexChanged(object sender, EventArgs e)
{ 
    // Code to execute when the SelectedIndexIsChanged goes here
}
0
Djenny Floro