かるあ のメモ

アクセスカウンタ

help リーダーに追加 RSS 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 で既に登録されているかどうかも見てくれているようだしいい感じです。

設定テーマ

注目テーマ 一覧

月別リンク

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文