Custom コントロールに Extender を含める
<<
作成日時 : 2007/11/15 16:30
>>
トラックバック 0 / コメント 0
ちょっと浅漬けになってたこの話題 ですが、とりあえずこんな方法で出来ましたよ〜ということで御紹介。
結構変遷がありましたが、最終的にはこんなソースコードになりました。
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports AjaxControlToolkit
<RequiredScript(GetType(FilteredTextBoxExtender))> _
Public Class カスタムコントロール
Inherits TextBox
Private Sub カスタムコントロール_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
' Extender を 親コントロールに追加して、
Dim filter As New FilteredTextBoxExtender
filter.Page = Me.Page
filter.ID = Me.ID & "_" & GetType(FilteredTextBoxExtender).Name
filter.TargetControlID = Me.ID
filter.FilterType = FilterTypes.Numbers
Me.Controls.Add(filter)
' ページの ScriptManager に登録します。
Dim _scriptManager As ScriptManager = ScriptManager.GetCurrent(Me.Page)
_scriptManager.RegisterExtenderControl(filter, Me)
_scriptManager.RegisterScriptDescriptors(filter)
End Sub
End Class
最初は Extender を Me.Controls.Add してもレンダリングされた ASPX にまったく変化が無かったので、だったら無理やり登録コードを書き出してやればいけるかもと思いこんなコードを書いてみた。Dim registerScript As String = _
"Sys.Application.add_init(function() {" & _
" $create(AjaxControlToolkit.FilteredTextBoxBehavior, " & _
" { 'FilterType':" & "2," & _
" 'id' :'" & Me.ClientID & "_FilteredTextBoxExtender'}" & _
", null, null, $get('" & Me.ClientID & "'))" & _
"});"
ScriptManager.RegisterStartupScript(Me.Page, GetType(String), Me.ClientID & "FileterdScript", registerScript, True)
これで一応 ASPX に初期化コードは書かれたけれど、ScriptManager が FilteredTextBoxExtender を知らないので Javascript エラーに。。。
どうにか Resource から Javascript を書き出してやろうと試行錯誤、そこで AjaxcontrolToolkit のソースを俳諧してたら ScriptObjectBuilder クラスでどうも Attribute から RequiredScript を解析してリソース一覧を作っているようなのでこんなコードを追加。Dim _scriptManager As ScriptManager = ScriptManager.GetCurrent(Me.Page)
For Each script As ScriptReference In ScriptObjectBuilder.GetScriptReferences(GetType(FilteredTextBoxExtender))
_scriptManager.Scripts.Add(script)
Next
ここまでで一応 Extender 込みのカスタムコントロールを作成することは出来たんだけれど、もう少しすっきりしたいなーということで Visual Studio でチマチマステップ実行していたら ScriptManager.RegisterExtenderControl で Extender の登録が出来ることを発見。Dim _scriptManager As ScriptManager = ScriptManager.GetCurrent(Me.Page)
' ScriptManager に FilteredTextBoxExtender を使用することを伝え
_scriptManager.RegisterExtenderControl(filter, Me)
' 初期化コードを吐き出させる
_scriptManager.RegisterScriptDescriptors(filter)
最終的に ScriptObjectBuilderは使わなかったんだけれど、このあたりの仕組みは他の時に使えそうだなー。
使っているところを見るとわかるけれど、指定した Extender が必要としている ScriptReference の一覧を列挙して返してくれる。
他の Extender で既に登録されているかどうかも見てくれているようだしいい感じです。
|