
No.3ベストアンサー
- 回答日時:
> Custom Eventを用いた場合、DLL呼び元側で用意するなどの処置が
> 必要になると思いますが、
> そうでは無く、コントロール側だけの実装で対応したいのですが無理でしょうか?
イベントハンドラを登録する側のコードに変化はありません。
イベントに対してAddHandlerする場合,
対象イベントがCustom Eventであろうがなかろうが同一コードになります。
# というか,おそらくMSILレベルで同一。
そして,イベントにハンドラが登録されているかどうかを調べる方法は,
イベントを実装する側で登録の有無を記録することが唯一の方法になります。
# No.2さんのリフレクションによる方法は,内部実装の変化に追従できない。
イベントへの登録の有無が必要になるのは
a. イベントを持つクラス
b. イベントハンドラを登録するクラス
c. 上記以外のクラス
のどれでしょうか。
aであればCustom Eventにして事が足ります。
修正するのはイベントを持つクラスになります。
bであればAddHandlerのタイミングでフラグを立てれば事が足ります。
修正するのはイベントハンドラを登録するクラスになります。
cであればCustom Eventにしてさらにプロパティで外部に登録されているかを公開することになります。
修正するのはイベントを持つクラスとそのクラスを使うクラスになります。
ただし,最初に構成を見直すことをやはりお薦めします。
ハンドラの有無の確認は,C#でイベントを書いている場合くらいしか必要になるとは思えないので。
# C#ではRaiseEvent相当がないので,if (Event != null) Event(this, e);みたいに書かざるをえない。
返事遅れてすみません。
上記の件を色々検証したのですが、どうもうまくいかないため
結局、ご指摘通り、別仕様で対応する事になりました。
色々ありがとうございました。
No.1
- 回答日時:
根本的には仕様の見直しをすべきですが……。
外部のプログラムは自分がコールバックが欲しいイベントに対して登録するのですから,判断が必要な状況自体がおかしいわけです。
それはともかく……。
どうしても必要ならば,Custom Eventを使えばAddHandlerやRemoveHandlerのタイミングを捉えることができます。
http://msdn.microsoft.com/ja-jp/library/6hwhs172 …
EventHandler型のフィールドをバックグラウンドとしてもっておいて,
AddHandlerでCombine/RemoveHandlerでRemoveし,
さらに判定用のプロパティを用意して,
そのプロパティではフィールドがNothing「ではない」かどうかを返せばよいと思います。
この回答への補足
Custom Eventを用いた場合、DLL呼び元側で用意するなどの処置が
必要になると思いますが、
そうでは無く、コントロール側だけの実装で対応したいのですが無理でしょうか?
コントロールがすでに提供済みの為、
呼元側に手を加えずに、対応しないと行けない状態なのです。
後出して申し訳ありませんが、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
CloseとDisposeの違い
Visual Basic(VBA)
-
実行時にコントロールのイベントの登録/解除を、イベントハンドラのメソッドをあらかじめ知っていないロジックから実施する方法
Visual Basic(VBA)
-
DataTableから条件を満たした行を別のDatatableへコピーしたい
その他(プログラミング・Web制作)
-
-
4
DataGridViewでセルクリックイベントを発生させるには
Visual Basic(VBA)
-
5
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
6
CellEnterイベント仕様について
Visual Basic(VBA)
-
7
VBのReturnの使い方
Visual Basic(VBA)
-
8
DoEventsがやはり分からない
Visual Basic(VBA)
-
9
Oracle 2つのDate型の値の差を「分」で取得したい
その他(データベース)
-
10
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
11
ポインタについて
Visual Basic(VBA)
-
12
vb.netで画面のコントロールId名を変数で動的に制御し処理する方法
Visual Basic(VBA)
-
13
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
-
14
DataGridViewのセル編集完了後に値を設定するには
Visual Basic(VBA)
-
15
PreviewKeyDownイベントが2回発生する
Visual Basic(VBA)
-
16
SQL Server のデータをCSVファイルに保存
SQL Server
-
17
コンボボックスの一部のアイテムを選択不可能に
C言語・C++・C#
-
18
.NETアプリを作ったときの .manifest ファイルって必要なの
C言語・C++・C#
-
19
ボタンクリックイベント 重複防止について
C言語・C++・C#
-
20
Loadイベント中にほかのイベントを発生したくない
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ボタンのオーナードローについて
-
イベントにAddHandlerされてい...
-
VB.NETでのEnumの使用について
-
FriendとPublicの違い。。。
-
(UWSC) 「#32770」の意味わかり...
-
特定のビューへのポインタ取得...
-
VC++ リストボックスにデータを...
-
DebugクラスとTraceクラスの違い
-
[MFC] CWnd::MessageBoxの警告...
-
【C++】vectorについて
-
【ASP.NET】 独自で作成したク...
-
既定のコンストラクタがない?
-
DataGridViewのセルに斜線を引...
-
クラス内の構造体の実体化とア...
-
任意の解像度のメモリデバイス...
-
C#で通常のbuttonコントロール...
-
【VC++】クラスの追加方法について
-
C#でVB.NETのReplaceコマンドを...
-
ユーザーフォームのVBAエラー
-
オブジェクト型の変数が定義さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA チェックボックスをオーバ...
-
FriendとPublicの違い。。。
-
イベントにAddHandlerされてい...
-
既定のコンストラクタがない?
-
ダイアログ表示時にチェックボ...
-
(UWSC) 「#32770」の意味わかり...
-
【ASP.NET】 独自で作成したク...
-
エディットコントロールでEnter...
-
クラスのアドレスを引数として...
-
WindowsAPIのリストビューの...
-
エディットコントロールのイベ...
-
MFCアプリのコマンドラインでパ...
-
ボタンのオーナードローについて
-
正規表現 [^/]+ の意味を教えて
-
C++ protectedにアクセス不可
-
このコンパイルエラーの意味に...
-
MFCのドラッグ&ドロップについて
-
C# 別プロジェクトのフォームを...
-
オーバーライド関数の呼び出し...
-
MFCのCListCtrlでスクロールを検出
おすすめ情報