Принудительное использование текстового поля TargetControl для использования значения в AutocompleteExtender

StackOverflow https://stackoverflow.com/questions/250603

Вопрос

Я уверен, что для этого мне придется написать поддерживающий код JavaScript. У меня есть расширитель автозаполнения, который выбирает значения из таблицы базы данных, когда выбор сделан, я бы хотел установить идентификатор выбранного значения в скрытый элемент управления. Я могу сделать это, обработав изменение значения в текстовом поле и сделав вызов select для базы данных. Выберите idCompany из Companies, где CompanyName = " значение текстового поля " ;;

Самое важное - это ограничить значения текстового поля, которое является targetcontrol для расширителя автозаполнения, ТОЛЬКО использовать значения из выпадающего списка автозаполнения. Возможно ли это с этим контролем, где-нибудь есть примеры? есть ли лучший элемент управления для использования (в наборе инструментов управления ajax или в стандартной среде .net - не сторонний элемент управления)?

Я попытаюсь выработать некоторый javascript, но я вернусь к этому вопросу, чтобы узнать, есть ли у кого-нибудь полезные ссылки. Я гуглил прошлой ночью довольно долго.

Обновление: я не получил ответа или каких-либо полезных ссылок, я разместил почти приемлемый пользовательский элемент управления, который делает то, что я хочу, с несколькими выполнимыми проблемами.

Это было полезно?

Решение

Никто не смог дать мне ответ. Это была постоянная сага. Это началось, когда я пытался найти решение, не использующее выпадающие списки для больших объемов данных . Я сталкивался с проблемами так много раз в предыдущих проектах. Это кажется работоспособным кодом. Теперь мне нужно знать, как предоставить свойство AutoPostBack и разрешить некоторые события, такие как SelectedValueChanged. И из-за JavaScript, он будет конфликтовать с другим элементом управления, если у меня есть несколько из них на одной странице. Ну, это некоторые из известных проблем, с которыми я сталкиваюсь в коде, но это начало и определенно лучше, чем смотреть на зависший браузер в течение 3 или 4 минут, пока выпадающий список загружает 30k элементов списка.

В этом коде предполагается, что существует файл asmx с методами сценария GetCompanyListBySearchString и GetCompanyIDByCompanyName.

ASPX FILE

<%@ 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.

Извините, что так новичок, но мне не удалось вызвать веб-сервис со стороны клиента. Я прочитал эту документацию: 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

Извините, если я вас неправильно понял, но я просто пытаюсь вести других людей, которые проходят через ту же ситуацию.

Большое спасибо.

Вы можете проверить значение выбора, перехватив событие ClientItemSelected и убедитесь, что оно не пустое.

scroll top