可能なイベントごとにハンドラを明示的に作成しなくても、特定のWinFormsコントロールの起動イベントをすべて一覧表示する方法はありますか?たとえば、さまざまなデータバインドアクション中にDataGridViewとBindingSourceの間で発生する一連のイベントを確認することができます。イベントを発生させる制御を監視します。
答えて
を可能性が加入していないのであればイベントであっても解雇されていません反射を使用していますが、さまざまなイベントハンドラシグネチャが含まれているため、ややこしいことになります。基本的には、そのタイプのイベントごとにEventInfo
を取得し、を呼び出す前にEventHandlerType
プロパティを使用して、デリゲートタイプを作成します。 Delegate.CreateDelegate
は、通常のイベントハンドラパターンに従うすべてのものに対して機能します。
サンプルアプリケーションです。それは何もチェックしていないことに注意してください - あなたが例外をスローする "非標準"イベントで何かを与えるなら、それは。あなたはかなり簡単に反射を使用してイベント引数を表示することもできます。
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Reflection;
namespace ConsoleApp
{
class Program
{
[STAThread]
static void Main(string[] args)
{
Form form = new Form { Size = new Size(400, 200) };
Button button = new Button { Text = "Click me" };
form.Controls.Add(button);
EventSubscriber.SubscribeAll(button);
Application.Run(form);
}
}
class EventSubscriber
{
private static readonly MethodInfo HandleMethod =
typeof(EventSubscriber)
.GetMethod("HandleEvent",
BindingFlags.Instance |
BindingFlags.NonPublic);
private readonly EventInfo evt;
private EventSubscriber(EventInfo evt)
{
this.evt = evt;
}
private void HandleEvent(object sender, EventArgs args)
{
Console.WriteLine("Event {0} fired", evt.Name);
}
private void Subscribe(object target)
{
Delegate handler = Delegate.CreateDelegate(
evt.EventHandlerType, this, HandleMethod);
evt.AddEventHandler(target, handler);
}
public static void SubscribeAll(object target)
{
foreach (EventInfo evt in target.GetType().GetEvents())
{
EventSubscriber subscriber = new EventSubscriber(evt);
subscriber.Subscribe(target);
}
}
}
}
私はReflectionを使ってこれを行うことができると思います。
これはできません。あなたはフレームワークのクラスの多くを見るためにリフレクターを使用している場合は、イベントを発射したときには、一般的なパターンを見つけることができます:
// fire event
if (EventDelegate != null)
EventDelegate(eventArgs);
を誰もあなたがそれに
私はそれができないことを意味する理由がわかりません - それは単にイベントを購読する必要があることを意味します。コードとの間には、コード内の各イベントを明示的に*購読することと大きな違いがあります。 –
私はあなたが髪を分割していると思います。ハードコードされたデリゲートを作成するか、またはリフレクションを使用することによって、まだイベントハンドラを「明示的に」追加しています。私の反応は、彼が(たとえリフレクションでも)イベントに全く加入したくないと仮定したが、他の方法でイベントのシーケンスを見たいと思った。 –
- 1. レイクタスクの監視と制御
- 2. JMXローカル監視へのアクセス制御
- 3. 分散アプリケーションコマンド/制御と監視
- 4. コードから発せられたイベントを監視するソフトウェア
- 5. 例外を発生させ、コードを無視してwhileループに制御を転送する
- 6. プロセスを起動してイベントを監視して監視します
- 7. onItemDisclosureイベントを発生させるとitemtapイベントが発生する
- 8. MonoTouch.Dialogでイベントを発生させるEventHandlerの順序を制御できますか?
- 9. リピータ内で制御イベントが発生しない
- 10. ユーザーコントロールのイベントを発生させる方法で読み込むユーザーコントロールを制御する方法
- 11. CustomUnboundColumnDataイベントを強制的に発生させることはできますか?
- 12. ネットワークプリントを監視して制御するためにペーパーカットをインストールしてください
- 13. Silverlightイベントを発生させ、さらに1秒後に別のイベントを発生させます
- 14. jQueryイベントを発生させるバインドイベント
- 15. JavaScriptでイベントを発生させる
- 16. Javascriptで「ペースト」イベントを発生させる
- 17. AlamoFireキャッシュ制御ヘッダーを無視する
- 18. Pythonで発信インターネットリクエストを監視する
- 19. 更新パネルのModalpopupエクステンダー。発砲しないイベントを制御します。
- 20. チラシ層制御イベント?
- 21. C#でイベントを発生させて出力しますか?
- 22. addTargetがイベントを発生させない
- 23. MouseOverイベントでdijit.MenuBarを制御する
- 24. Chromeがスクリプトタグのonloadイベントを正しく監視していませんか?
- 25. SQL Server 2012 - 頻繁に発生する「システム状態監視スレッド:オペレーティングシステムエラー例外0x1が発生しました」
- 26. XHR進捗イベントを使用してMySQLクエリを監視する
- 27. 放出されたイベントは、監視されていなくても重大な負荷を発生させますか?
- 28. 別のイベントからイベントを発生させる方法
- 29. Google Mapバグ、DragendイベントIE内でClickイベントを発生させる
- 30. ダイナミックコントロールで発生したイベントへのレイトバインディング - イベントは発生しません
まさに私が探していたもの!私は真剣な読書や練習をリフレクションで行う必要があるように見えます。ありがとう! – BikeMrown
非常に役に立ちました。ありがとうございました。 –