强制TargetControl Textbox使用AutocompleteExtender中的值

时间:2008-10-30 15:30:24

标签: asp.net-2.0 ajaxcontroltoolkit autocompleteextender

我确信我必须编写支持javascript代码才能执行此操作。我有一个自动完成扩展器设置,从数据库表中选择值,当做出选择时,我希望它将所选值的ID设置为隐藏控件。我可以通过处理文本框上的值更改并对数据库进行select调用来执行此操作,从Company Where CompanyName =“text box value”中选择idCompany;

最重要的是将自动完成扩展程序的目标控件文本框的值限制为仅使用自动完成下拉列表中的值。这种控制是否可行,是否有某些例子?是否有更好的控制使用(在ajax控件工具包或标准.net框架内 - 不是第三方控件)?

我将尝试制作一些javascript,但我会回到这个问题,看看是否有人有一些有用的链接。昨晚我一直在谷歌上搜索这段时间。

更新:我没有得到答案或任何有用的链接,我发布了一个几乎可以接受的用户控件来完成我想要的工作,但有一些可行的问题。

3 个答案:

答案 0 :(得分:2)

没有人能给我一个答案。这一直是一个传奇故事。它是在我试图找到solution not using drop down lists for large amounts of data时开始的。在以前的项目中,我已经多次遇到过这个问题。这似乎是可行的代码。现在我需要知道如何提供AutoPostBack属性,并允许一些事件,例如SelectedValueChanged。并且由于javascript,如果我在同一页面上有多个控件,它将与另一个控件冲突。好吧,这是我正在考虑的代码中的一些已知问题,但它是一个开始,并且肯定比看着挂起的浏览器3或4分钟,而下拉正在加载30k列表项目。

此代码假设有一个asmx文件,其中包含脚本方法GetCompanyListBySearchString和GetCompanyIDByCompanyName。

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

答案 1 :(得分: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

对不起,如果我误解了你,但我只是想引导那些经历同样情况的人。

非常感谢。

答案 2 :(得分:0)

您可以通过捕获ClientItemSelected事件来检查选择的值,并确保它不是空白。