Pregunta

Estoy seguro de que voy a tener que escribir código javascript de soporte para hacer esto. Tengo un extensor autocompletado configurado que selecciona valores de una tabla de base de datos, cuando se realiza una selección, me gustaría que establezca la ID del valor seleccionado en un control oculto. Puedo hacerlo manejando un cambio de valor en el cuadro de texto y haciendo una llamada selecta a la base de datos, seleccione idCompany from Companies Donde CompanyName = " el valor del cuadro de texto " ;;

Lo más importante es restringir los valores del cuadro de texto que es el control de destino para que el extensor de autocompletar SÓLO use valores del menú desplegable de autocompletar. ¿Es esto posible con ese control, hay ejemplos en alguna parte? ¿Existe un mejor control para usar (dentro del kit de herramientas de control de ajax o el marco .net estándar, no un control de terceros)?

Intentaré calcular algunos javascript, pero volveré a consultar esta pregunta para ver si alguien tiene algunos enlaces útiles. He estado buscando en Google esta última noche durante bastante tiempo.

Actualización: no obtuve una respuesta o ningún enlace útil, publiqué un control de usuario casi aceptable que hace lo que quiero, con algunos problemas posibles.

¿Fue útil?

Solución

Nadie fue capaz de darme una respuesta. Esta ha sido una saga en curso. Comenzó cuando intentaba encontrar una solución que no utilizaba listas desplegables para grandes cantidades de datos . He tenido problemas con esto tantas veces en proyectos anteriores. Este parece ser un código viable. Ahora necesito saber cómo suministrar una propiedad de AutoPostBack y permitir algunos eventos, como SelectedValueChanged. Y debido al javascript, entrará en conflicto con otro control, si tengo más de uno de ellos en la misma página. Bueno, esos son algunos de los problemas conocidos que estoy viendo con el código, pero es un comienzo y definitivamente mejor que mirar un navegador bloqueado durante 3 o 4 minutos, mientras que el menú desplegable está cargando 30k artículos de la lista.

Este código está asumiendo que hay un archivo asmx con los métodos de secuencia de comandos GetCompanyListBySearchString y 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" />

CÓDIGO DETRÁS

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

Otros consejos

Gracias por tu publicación aquí. Sin embargo, es útil, asumiendo que todos conocen la configuración para obtener el servicio web llamado por una función javascript.

Lamento ser tan novato, pero no pude recibir el servicio web desde el lado del cliente. Leí esta documentación: http://msdn.microsoft.com/en-us /magazine/cc163499.aspx

Además, encontré una publicación interesante que explica cómo crear / obtener un par de valores de nombre, que es prácticamente lo que está esperando, en la medida en que lo entendí:

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

Lo siento si te he entendido mal, pero solo estoy tratando de guiar a otras personas que pasan por la misma situación.

Muchas gracias.

Puede verificar el valor de la selección al interceptar el evento ClientItemSelected y asegurarse de que no esté en blanco.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top