asp.netのカスタムサーバーコントロールにメソッド名を渡すにはどうすればよいですか?
-
09-06-2019 - |
質問
私は別のコントロールを拡張する顧客サーバー コントロールに取り組んでいます。フォーム上の他のコントロールにアタッチしても問題ありません。
vb.net の場合: Parent.FindControl(TargetControlName)
ASPX マークアップでコントロールにメソッドを渡したいと考えています。
例えば: <c:MyCustomerControl runat=server InitializeStuffCallback="InitializeStuff">
そこで、リフレクションを使用して、親から指定されたメソッド名にアクセスしてみました。
(VB で) のようなもの
Dim pageType As Type = Page.GetType
Dim CallbackMethodInfo As MethodInfo = pageType.GetMethod( "MethodName" )
'Also tried
sender.Parent.GetType.GetMethod("MethodName")
sender.Parent.Parent.GetType.GetMethod("MethodName")
このメソッドはページの一部ではないため、見つかりません。どこを見ればよいですか?他のコントロールでも同様の動作をしているのを見てきたので、これが可能であると確信しています。
言い忘れていましたが、私の回避策は、コードビハインドでコントロール イベントを与え、それらにアタッチすることです。
解決
ASPX マークアップでメソッドを渡せるようにしたい場合は、 Browsable
イベントのコード内の属性。
VB.NET
<Browsable(True)> Public Event InitializeStuffCallback
C#
[Browsable(true)]
public event EventHandler InitializeStuffCallback;
参照:コンポーネントの設計時属性 そして BrowsableAttribute クラス
タグ コードで変更できるようにするには、すべてのイベント、プロパティ、その他を、browsable 属性を持つコントロールのコードビハインドに含める必要があります。
他のヒント
通常、リフレクション経由でメソッドを取得する必要はありません。ユーザー コントロール内で、パブリック イベントを定義します (申し訳ありませんが、vb 構文がわからないため、これは C# で行われます)。
public event EventHandler EventName;
ここで、aspx ページ内、またはユーザー コントロールのコンテナー内で、EventHandler に一致する保護されたメソッドを定義します。
protected void MyCustomerControl_MethodName(object sender, EventArgs e) { }
これで、マークアップ内で次を使用できます
<c:MyCustomerControl id="MyCustomerControl" runat=server OnEventName="MyCustomerControl_MethodName">
あなたの回避策は実際にはより良い答えです。コントロールのライフサイクルの特定の部分で実行する必要があるコードがある場合は、 すべき イベントを公開して、コンテナーがカスタム機能を使用してライフサイクルを拡張できるようにします。
buyutec 氏と Jesse Dearing 氏はどちらも受け入れられる答えを持っています。
[Browsable(true)]
[プロパティ] ウィンドウでプロパティを確認できます。ただし、イベントは表示されませんが、私にとっては問題ありません。
先ほど見落としていたのは、タグからコントロールを参照すると、先頭に On が付加されるという事実です。
すべての ASP.NET ページは、 独自のクラス から継承した Page
次のように:
class MyPage : Page
したがって、リフレクション経由でそのメソッドを見つけるには、正しい型、つまりページ コードを格納するページ クラスの型を取得する必要があります。
このコントロールをインスタンス化するには複数のページをサポートする必要があると思います。リフレクション経由でページのインスタンスの子タイプを見つけることができると思いますが、方法は覚えていませんが、できるはずです。
しかし...他の人も言っているように、そのようなケースは何ですか イベント のためのものです。