Pergunta

Eu estou certo que eu vou ter que escrever código de suporte javascript para fazer isso. Eu tenho um extensor autocomplete configurar que os valores seleciona uma tabela de banco de dados, quando uma seleção é feita, eu gostaria que ele para definir o ID do valor selecionado para um controle oculto. Eu posso fazer isso por lidar com uma mudança de valor na caixa de texto e fazer uma chamada de seleção para o banco de dados, Select idCompany de empresas onde CompanyName = "o valor da caixa de texto";

A coisa mais importante é restringir os valores de caixa de texto que é o targetcontrol para o extensor autocomplete para valores de uso apenas do baixo queda autocomplete. Isso é possível com esse controle, há exemplos em algum lugar? há um melhor controle para uso (dentro do kit de ferramentas de controle ajax ou .NET Framework padrão - não um controle de terceiros)?

Eu vou estar a tentar elaborar algum javascript, mas eu vou ser a verificação de volta a esta questão para ver se alguém tem algumas ligações úteis. Estive pesquisando esta última noite por um bom tempo.

Update: Eu não recebi uma resposta ou quaisquer links úteis, eu postei um controle de usuário quase aceitável que faz o que eu quero, com algumas questões viáveis.

Foi útil?

Solução

Ninguém foi capaz de me dar uma resposta. Esta tem sido uma saga em curso. Tudo começou quando eu estava tentando encontrar uma solução não usar listas drop-down para grandes quantidades de dados. Eu ter executado em problemas com isso tantas vezes em projectos anteriores. Este parece ser o código viável. Agora eu preciso saber como fornecer uma propriedade AutoPostBack, e permitir que para alguns eventos, como SelectedValueChanged. E devido ao javascript, ele vai entrar em conflito com outro controle, se eu tiver mais de um deles na mesma página. Bem, isso é alguns dos problemas conhecidos que eu estou olhando com o código, mas é um começo e definitivamente melhor do que olhando para um navegador pendurado por 3 ou 4 minutos, enquanto o baixo queda é de carregamento 30k itens da lista.

Este código é assumindo que não é um arquivo asmx com os métodos de script GetCompanyListBySearchString e GetCompanyIDByCompanyName.

ASPX arquivo

<%@ 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" />

ATRÁS CÓDIGO

[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
    }
}
}

Outras dicas

Obrigado por seu post aqui. É útil, no entanto, ele está assumindo que todo mundo sabe a configuração para obter o webservice chamado por uma função javascript.

Desculpa ser soo novato, mas eu não poderia obter o webservice chamado a partir do lado do cliente. Eu li esta documentação: http://msdn.microsoft.com/en-us /magazine/cc163499.aspx

Além disso, eu encontrei um interessante post que explica como criar / obter um par nome valor que é muito bonito o que você está esperando, tanto quanto eu entendi:

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

Desculpe se eu não entendi você, mas eu estou apenas tentando orientar outras pessoas que passam pela mesma situação.

Muito obrigado.

Você pode verificar o valor da seleção por aprisionamento em evento ClientItemSelected e garantir que ele não está em branco.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top