2008-10-30 8 views
1

Je suis sûr que je vais devoir écrire du code javascript pour le faire. J'ai une configuration d'extendeur autocomplete qui sélectionne les valeurs d'une table de base de données, quand une sélection est faite, je voudrais qu'il définisse l'ID de la valeur sélectionnée à un contrôle caché. Je peux le faire en manipulant un changement de valeur sur la zone de texte et en faisant un appel select à la base de données, Sélectionnez idCompany de Companies où CompanyName = "la valeur de la zone de texte"; Le plus important est de contraindre les valeurs de la zone de texte qui est le targetcontrol pour l'extendeur de saisie semi-automatique à utiliser UNIQUEMENT les valeurs de la liste déroulante autocomplete. Est-ce possible avec ce contrôle, y a-t-il des exemples quelque part? Y a-t-il un meilleur contrôle à utiliser (au sein de la boîte à outils de contrôle ajax ou du framework .net standard - pas un contrôle tiers)?Forcer TargetControl Textbox à utiliser une valeur dans AutocompleteExtender

Je vais essayer de trouver du javascript, mais je reviendrai à cette question pour voir si quelqu'un a des liens utiles. J'ai été googling cette nuit dernière pendant un bon moment.

Mise à jour: Je n'ai pas obtenu de réponse ou de liens utiles, j'ai posté un contrôle utilisateur presque acceptable qui fait ce que je veux, avec quelques problèmes réalisables.

Répondre

2

Personne n'a été capable de me donner une réponse. Cela a été une saga en cours. Il a commencé quand j'essayais de trouver un solution not using drop down lists for large amounts of data. J'ai rencontré des problèmes avec cela tellement de fois dans les projets précédents. Cela semble être un code réalisable. Maintenant, j'ai besoin de savoir comment fournir une propriété AutoPostBack et autoriser certains événements, tels que SelectedValueChanged. Et en raison du javascript, il sera en conflit avec un autre contrôle, si j'en ai plus d'un sur la même page. Eh bien, ce sont quelques-uns des problèmes connus que je regarde avec le code, mais c'est un début et certainement mieux que de regarder un navigateur accroché pendant 3 ou 4 minutes tandis que le menu déroulant charge 30k éléments de la liste.

Ce code suppose qu'il existe un fichier asmx avec les méthodes de script GetCompanyListBySearchString et GetCompanyIDByCompanyName.

ASPX FICHIER

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

CODE DERRIÈRE

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

Merci pour votre message ici. Il est utile, cependant, il est supposé que tout le monde connaît la configuration pour obtenir le service web appelé par une fonction javascript.

Désolé d'être un débutant, mais je n'ai pas pu appeler le service web du côté client. J'ai lu cette documentation: http://msdn.microsoft.com/en-us/magazine/cc163499.aspx

De plus, j'ai trouvé un post intéressant qui explique comment créer/obtenir une paire de valeurs de nom qui est à peu près ce que vous attendez à ce que je compris:

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

Désolé si je vous ai mal compris, mais j'essaie juste de guider d'autres personnes qui traversent la même situation.

Merci beaucoup.

+0

J'ai juste eu le temps ce matin de lire ce lien. Tandis que j'étais capable de faire un contrôle d'utilisateur acceptable, le lien vers le blog dans msdn était une bonne lecture. Merci pour votre réponse. – stephenbayer

+0

Comme une mise à jour, j'ai utilisé les informations de l'entrée de blog que vous avez lié à un autre contrôle, en utilisant les mêmes idées. C'était une excellente information. – stephenbayer

0

Vous pouvez vérifier la valeur de la sélection en piégeant l'événement ClientItemSelected et assurez-vous qu'il n'est pas vide.

Questions connexes