1

これを行うには、サポートする JavaScript コードを作成する必要があると確信しています。データベース テーブルから値を選択するオートコンプリート エクステンダーを設定しています。選択が行われたときに、選択した値の ID を非表示のコントロールに設定したいと考えています。これを行うには、テキスト ボックスの値の変更を処理し、データベースに対して選択呼び出しを行います。Select idCompany from Companies Where CompanyName = "the text box value";

最も重要なことは、オートコンプリート エクステンダーのターゲット コントロールであるテキスト ボックスの値を、オートコンプリート ドロップダウンの値のみを使用するように制限することです。そのコントロールでこれは可能ですか、どこかに例がありますか? 使用するより良いコントロールはありますか (サードパーティのコントロールではなく、ajax コントロール ツールキットまたは標準の .net フレームワーク内)。

私はいくつかのJavaScriptを解決しようとしていますが、この質問に戻って、誰かが有用なリンクを持っているかどうかを確認します. 私はこれを昨夜かなり長い間グーグルで検索してきました。

更新: 回答や有用なリンクが得られませんでした。実行可能な問題がいくつかありますが、私が望むことを行うほぼ許容できるユーザー コントロールを投稿しました。

4

3 に答える 3

2

誰も私に答えることができませんでした。これは進行中の物語です。それは、大量のデータにドロップダウンリストを使用しない解決策を見つけようとしたときに始まりました。私は以前のプロジェクトでこれに関して何度も問題に遭遇しました。これは実行可能なコードのようです。ここで、AutoPostBackプロパティを指定し、SelectedValueChangedなどのいくつかのイベントを許可する方法を知る必要があります。また、javascriptが原因で、同じページに複数のコントロールがある場合、別のコントロールと競合します。まあ、それは私がコードで見ている既知の問題のいくつかですが、ドロップダウンが30kのリストアイテムをロードしている間にハングしたブラウザを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
    }
}
}
于 2008-11-05T15:41:05.720 に答える
2

ここに投稿していただきありがとうございます。これは便利ですが、javascript 関数によって呼び出される Web サービスを取得するための設定を誰もが知っていることを前提としています。

初心者で申し訳ありませんが、クライアント側から Web サービスを呼び出すことができませんでした。このドキュメントを読みました: http://msdn.microsoft.com/en-us/magazine/cc163499.aspx

さらに、名前と値のペアを作成/取得する方法を説明する興味深い投稿を見つけました。

http://blogs.msdn.com/phaniraj/archive/2007/06/19/how-to-use-a-key-value-pair-in-your-autocompleteextender.aspx

誤解していたら申し訳ありませんが、同じ状況を経験した他の人を案内しようとしているだけです.

どうもありがとう。

于 2008-11-27T16:11:39.450 に答える
0

ClientItemSelected イベントをトラップすることで選択の値を確認し、空白でないことを確認できます。

于 2009-02-12T23:41:36.347 に答える