スクリプトコントロール(ASP.Net)でオートコンプリートコントロールスクリプト側を取得する方法
-
19-08-2019 - |
質問
問題 スクリプトファイルのスクリプトコントロールを使用して、Ajax Toolkitのオートコンプリートコントロールでイベントをキャプチャして割り当てるにはどうすればよいですか?
説明
基本的に、テキストボックスとオートコンプリートコントロールを組み合わせるスクリプトコントロールを作成して、オートコンプリートの機能する汎用コントロールを用意しました。次のステップは、アイテムの検索中に処理イメージなどを追加することでした。簡単そうに思えました。
protected override IEnumerable<ScriptDescriptor> GetScriptDescriptors()
{
ScriptControlDescriptor desc = new ScriptControlDescriptor
("NDI.WebControls.Client.GenericAutoComplete", this.ClientID);
desc.AddProperty("autoCompleteID", autoComplete.ClientID);
return new ScriptDescriptor[] { desc };
}
そして、javascriptで通常:
initialize: function()
{
this._autoComplete = $get(this._autoCompleteID);
//this._autoCompleteID does have a value
this._autoCompleteClientPopulating =
Function.createDelegate(this, this.handleAutoCompleteClientPopulating);
$addHandler(this._autoComplete, "clientPopulating",
this._autoCompleteClientPopulating);
NDI.WebControls.Client.GenericAutoComplete.callBaseMethod(this, 'initialize');
},
これで動作するはずですが、動作しません。どうして?どうやら通常のコントロールのようにページにレンダリングされるオートコンプリートコントロールがないためです。したがって、$ get部分に到達すると、IDプロパティにテキストプロパティがあるにもかかわらずnullになります。 (つまり、コントロールは存在しません)
これを行うことは可能ですか、またはメソッドを割り当てるためにOnXyzプロパティサーバー側を使用する必要がありますか?次のように:
autocomplete.OnClientPoplating = someScript;
解決
ANSWER
Booyahはそれを見つけました。オートコンプリートにはjavascriptのイベントにアクセスする方法が組み込まれていることがわかりました:
サーバー側では、BehaviorIDを設定する必要があります:
autoComplete.BehaviorID = "autoCompleteBehavior";
そしてGetScriptDescriptorsメソッドで設定します:
protected override IEnumerable<ScriptDescriptor> GetScriptDescriptors()
{
ScriptControlDescriptor desc = new
ScriptControlDescriptor("NDI.WebControls.Client.GenericAutoComplete", ClientID);
desc.AddProperty("autoCompleteID", autoComplete.BehaviorID);
return new ScriptDescriptor[] { desc };
}
もちろん、プロパティスクリプト側を追加してその値をキャプチャする必要があります。それを行ったら、検索を使用して値を取得する必要があります。次に、イベントハンドラを作成する必要があります。
this._autoComplete = $find(this._autoCompleteID);
this._onAutoCompletePopulating =
Function.createDelegate(this, this.handleOnAutoCompletePopulating);
最後に、オートコンプリートコントロール(Behaviorオブジェクト)の組み込みのイベントセッターを使用します。
this._autoComplete.add_populating(this._onAutoCompletePopulating);
そしてブーム、設定されました。