1

我确定我将不得不编写支持 JavaScript 代码来执行此操作。我设置了一个自动完成扩展器,可以从数据库表中选择值,当进行选择时,我希望它将所选值的 ID 设置为隐藏控件。我可以通过处理文本框上的值更改并对数据库进行选择调用来做到这一点,从公司中选择 idCompany 其中公司名称 =“文本框值”;

最重要的是将作为自动完成扩展器的目标控件的文本框的值限制为仅使用自动完成下拉列表中的值。使用该控件是否可能,是否有示例?是否有更好的控件可供使用(在 ajax 控件工具包或标准 .net 框架内 - 而不是第三方控件)?

我将尝试编写一些 javascript,但我会检查这个问题,看看是否有人有一些有用的链接。我昨晚已经在谷歌上搜索了一段时间。

更新:我没有得到答案或任何有用的链接,我发布了一个几乎可以接受的用户控件,它可以满足我的需求,但有一些可行的问题。

4

3 回答 3

2

没有人能给我答案。这是一个持续的传奇。当我试图找到一个不使用下拉列表来处理大量数据的解决方案时,它就开始了。我在以前的项目中遇到过很多次这个问题。这似乎是可行的代码。现在我需要知道如何提供 AutoPostBack 属性,并允许一些事件,例如 SelectedValueChanged。并且由于 javascript,如果我在同一页面上有多个控件,它将与另一个控件发生冲突。嗯,这是我正在查看代码的一些已知问题,但这是一个开始,并且肯定比在下拉列表加载 30k 列表项时查看挂起的浏览器 3 或 4 分钟要好。

此代码假设有一个 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
    }
}
}
于 2008-11-05T15:41:05.720 回答
2

谢谢你在这里的帖子。它很有用,但是,假设每个人都知道获取由 javascript 函数调用的 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

对不起,如果我误解了你,但我只是想指导其他经历过同样情况的人。

非常感谢。

于 2008-11-27T16:11:39.450 回答
0

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

于 2009-02-12T23:41:36.347 回答