actions
パネルの場合Click
、その親のイベントを発生させることはできますか?現在このコードを持っていますが、Click
イベントはメソッドではないため、このコードは無効です。
誰かが私がこれを達成する方法を知っていますか?
actions.Click += delegate(object Sender, EventArgs e)
{
((Panel)Sender).Parent.Click();
}
event
C#を別のC#から直接上げることはできませんclass
(たとえそうであってもpublic
)。event
を代行して起動するメソッド(十分なアクセス修飾子を使用)を提供し、他のメソッドでそのメソッドを呼び出すことができますclass
。
ちなみに、これはリフレクションで可能ですが、汚いハックだと思います。
イベントを発生させる CLR のほとんどの型には、イベントの発生を処理する保護された On[EventName] メソッドがあります。リフレクションを使用して、この保護されたメソッドを「外部から」呼び出すことができます。
Control parent = ((Control)sender).Parent;
Type parentType = parent.GetType();
MethodInfo onClickMethod = parentType.GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic);
onClickMethod.Invoke(parent, new object[] { e });
リフレクション メソッドと拡張メソッドを使用してこれを実装したので、次のように呼び出すだけで (この場合は) LinkLabel クリック イベントを呼び出すことができます。
var link = new LinkLabel()'
link.Text = "Some link";
link.click();
click() メソッドは C# 拡張メソッドです。
public static void click(this LinkLabel linkLabel)
{
var e = new LinkLabelLinkClickedEventArgs((LinkLabel.Link)(linkLabel.prop("FocusLink")));
linkLabel.invoke("OnLinkClicked", e);
}
別の拡張メソッドを使用して、次のことを行います。
Clickイベントを発生させたい理由として私が考えることができる唯一の理由は、ユーザー入力をシミュレートしている場合です。自動テストドライバーなどに取り組んでいますか?もしそうなら、テストのみの補助メソッドでコードを汚すよりも良い解決策があるかもしれません。 これはグーグルで最初に出てきます、それが何か良いかどうかはわかりません。
アプリケーション自体で一種のフロー制御としてこれを実行しようとしている場合は、これが正しいことであるかどうかを確認するために一歩後退します。これは一種の「悪臭」です。