C#のカスタムコントロールイベント
-
02-10-2019 - |
質問
私はカスタムコントロールを作成しようとしており、そこからイベントを提起する必要があります。アイデアは、クリックイベントの最後にイベントを提起することです(onafterclick)。これを行うことに関する1つまたは2つのチュートリアルを見つけましたが、どこかでステップが明らかに欠けています。私は次のことを持っています。
コントロール:
public class AfterClickEventArgs : EventArgs
{
...
}
public partial class MyButton : CommandButton
{
public delegate void AfterClickEvnt(object sender, AfterClickEventArgs e);
public event AfterClickUpdatedEvnt AfterClick;
}
protected override void OnClick(EventArgs e)
{
...
Processing here
...
AfterClickEventArgs myArgs = new AfterClickEventArgs();
AfterClick(this, myArgs);
}
コントロールを使用したプログラムで:
initializeComponent():
this.MyButton.AfterClick += new System.EventHandler(this.cmdMyButton_Click);
この行では、コンパイルエラー(cmdmybutton_clickが存在します)が得られます。それは私に言う:タイプ 'system.eventhandler'を「namespace.mybutton.afterclick」に暗黙的に変換することはできません
誰かが私が何が欠けているのか教えてもらえますか、それともこれについて誤解してください。
解決
あなたのイベントはタイプであると宣言されています AfterClickEvnt
, 、しかし、あなたはそれを使用してそれを購読しようとしています EventHandler
. 。 2つを変換することはできません。
オプション:
正しいタイプを明示的に述べてください:
this.MyButton.AfterClick += new AfterClickEvnt(this.cmdMyButton_Click);
暗黙のメソッドグループ変換を使用します。
this.MyButton.AfterClick += cmdMyButton_Click;
ちなみに、カスタムデリゲートタイプを削除して、代わりにジェネリックを使用することをお勧めします EventHandler<T>
代表者:
public event EventHandler<AfterClickEventArgs> AfterClick;
他のヒント
あなたのコードにはいくつかの矛盾があるので、何が起こっているのかを言うのは難しいです。 (MyargsはNewargsになり、AfterclickupdateevntはAfterclickevntになりました)。また、デリゲートの代わりにイベントハンドラーを使用しようとします。
また、使用する方が良いです EventHandler<T>
そのため、代表者を悩ませる必要はありません。
public event EventHandler<AfterClickEventArgs> AfterClick;