TargetControl TextboxにAutocompleteExtenderの値を使用させる
-
05-07-2019 - |
質問
これを行うには、サポートするJavaScriptコードを記述する必要があります。データベーステーブルから値を選択するオートコンプリートエクステンダーのセットアップがあります。選択が行われたときに、選択した値のIDを非表示コントロールに設定したいと思います。これを行うには、テキストボックスの値の変更を処理し、データベースへのselect呼び出しを行います。CompanyName= "the text box value";の企業からidCompanyを選択します。
最も重要なことは、オートコンプリートエクステンダーのターゲットコントロールであるテキストボックスの値を、オートコンプリートドロップダウンの値のみを使用するように制限することです。そのコントロールでこれは可能ですか、どこかに例はありますか?使用するより良いコントロールがありますか(ajaxコントロールツールキットまたは標準の.netフレームワーク内-サードパーティコントロールではありません)?
JavaScriptを実行しようとしていますが、この質問に戻って便利なリンクがあるかどうかを確認します。私はかなり長い間、この昨夜グーグルをしてきました。
更新:回答も有用なリンクも得られませんでした。いくつかの実行可能な問題を抱えながら、私が望むことをするほぼ受け入れられるユーザーコントロールを投稿しました。
解決
誰も答えてくれませんでした。これは現在進行中の物語です。 使用していないソリューションを見つけようとしたときに開始されました大量のデータのドロップダウンリスト。私は以前のプロジェクトでこれに関する問題に何度も遭遇しました。これは実行可能なコードのようです。ここで、AutoPostBackプロパティを提供し、SelectedValueChangedなどのイベントを許可する方法を知る必要があります。また、JavaScriptが原因で、同じページに複数のコントロールがある場合、別のコントロールと競合します。まあ、それは私がコードで見ている既知の問題のいくつかですが、それは開始であり、ドロップダウンが30000リストアイテムをロードしている間に3または4分間ハングしたブラウザを見るよりも間違いなく良いです。
このコードは、スクリプトメソッドGetCompanyListBySearchStringおよびGetCompanyIDByCompanyNameを含むasmxファイルがあることを前提としています。
ASPXファイル
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SelectCompany.ascx.cs" Inherits="Controls_SelectCompany" %>
<%@ Register TagPrefix="ajaxToolkit" Namespace="AjaxControlToolkit" Assembly="AjaxControlToolkit" %>
<script language="javascript" type="text/javascript">
var txtCompanyIDHiddenField = '<%= fldCompanyID.ClientID %>';
var txtCompanyIDTextBox = '<%= txtCompany.ClientID %>';
function getCompanyID() {
if (document.getElementById(txtCompanyIDTextBox).value != "")
CompanyService.GetCompanyIDByCompanyName(document.getElementById(txtCompanyIDTextBox).value, onCompanyIDSuccess, onCompanyIDFail);
}
function onCompanyIDSuccess(sender, e) {
if (sender == -1)
document.getElementById(txtCompanyIDTextBox).value = "";
document.getElementById(txtCompanyIDHiddenField).value = sender;
}
function onCompanyIDFail(sender, e) {
document.getElementById(txtCompanyIDTextBox).value = "";
document.getElementById(txtCompanyIDHiddenField).value = "-1";
}
function onCompanySelected() {
document.getElementById(txtCompanyIDTextBox).blur();
}
</script>
<asp:TextBox ID="txtCompany" runat="server" onblur='getCompanyID()'
/><ajaxToolkit:AutoCompleteExtender runat="server" ID="aceCompany" CompletionInterval="1000" CompletionSetCount="10"
MinimumPrefixLength="2" ServicePath="~/Company/CompanyService.asmx" ServiceMethod="GetCompanyListBySearchString"
OnClientItemSelected="onCompanySelected" TargetControlID="txtCompany" />
<asp:HiddenField ID="fldCompanyID" runat="server" Value="0" />
コードビハインド
[System.ComponentModel.DefaultProperty("Text")]
[ValidationProperty("Text")]
public partial class ApplicationControls_SelectCompany : System.Web.UI.UserControl
{
public string Text
{
get { return txtCompany.Text; }
set
{
txtCompany.Text = value;
//this should probably be read only and set the value based off of ID to
// make certain this is a valid Company
}
}
public int CompanyID
{
get
{
int ret = -1; Int32.TryParse(fldCompanyID.Value, out ret); return ret;
}
set
{
fldCompanyID.Value = value.ToString();
//Todo: should set code to set the Text based on the ID to keep things straight
}
}
}
他のヒント
ここに投稿していただきありがとうございます。便利ですが、javascript関数によって呼び出されるWebサービスを取得するための設定を誰もが知っていることを前提としています。
すっごく初心者になって申し訳ありませんが、クライアント側からWebサービスを呼び出すことができませんでした。 このドキュメントを読みます: http://msdn.microsoft.com/en-us /magazine/cc163499.aspx
さらに、名前と値のペアを作成/取得する方法を説明した興味深い投稿を見つけました。
あなたを誤解して申し訳ありませんが、同じ状況を通過する他の人々をガイドしようとしています。
どうもありがとう。
選択の値を確認するには、ClientItemSelectedイベントをトラップし、空でないことを確認します。