【问题标题】:Autocomplete jquery and SQL , ASP.NET自动完成 jquery 和 SQL , ASP.NET
【发布时间】:2011-07-02 08:40:57
【问题描述】:

我正在尝试使用 jquery 创建一个自动完成文本框,该文本框将绑定到 SQL 数据库。我还想在页面上放置一个下拉列表,以便基于初始选择自动完成文本框将从不同的表中检索数据。这是一个 ASP.NET 2.0 页面,后面的代码是 VB.NET。我有 AJAX 自动完成功能,但它只匹配第一个字符,并且不如 jquery 强大。谁能分享一个示例代码,该代码将从 SQL 中检索搜索数据,并指导我如何使表名动态化?

非常感谢任何帮助

市场

【问题讨论】:

    标签: jquery asp.net sql vb.net


    【解决方案1】:

    您可以编写一个处理程序 (.ashx) 来从数据库中为您的文本搜索和表名返回查询结果。对于表名,请查看 SQL Server 中的 INFORMATION_SCHEMA.TABLES...

    看看这个 .NET AJAX Calls to ASMX or ASPX or ASHX? 使用 ScriptService 的更现代的方法 - 基本思想是相同的。

    如果需要,我将在明天发布代码(它的 v.late),

    Hth.

    编辑:

    在最简单的情况下(您会体会到在做更多涉及的事情时所涉及的问题)假设您有三个表:UserDepartment产品

    表:用户
    ID 整数
    名字 varchar(50)
    姓氏 varchar(50)
    DateOfBirth 日期时间

    表格:部门
    身份证号
    名称 varchar

    表格:产品
    身份证号
    名称 varchar

    你需要 3 个 Sprocs 来选择 Name 的一部分:

    Products和Departments的sproc格式相同:

    CREATE PROCEDURE dbo.ProductSelect (dbo.DepartmentSelect)
        @qry VARCHAR(50)
    AS
    BEGIN
        SET NOCOUNT ON;
    
        SELECT *
    FROM dbo.Product  (dbo.Department)
    WHERE [Name] LIKE '%' + @qry + '%'
    END
    

    对于用户来说略有不同:

    CREATE PROCEDURE [dbo].[UserSelect]
        @qryTerm VARCHAR(50)
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    
    SELECT U.Id, U.Forename + ' ' + U.Surname AS [Name], U.DateOfBirth
    FROM 
        dbo.[User] U
    WHERE
        (
            forename LIKE '%' + @qryTerm + '%'
            OR
            surname LIKE '%' + @qryTerm + '%'
        )
    ORDER BY 
        surname, Forename
    END
    

    基本页面/控件标记:

    <div>
        Tables:
        <asp:DropDownList runat="server" ID="ddlTables" />
    
    </div>
    
    <div>
        <asp:TextBox runat="server" ID="txtUser" />
    </div>
    ....
    

    要将下拉列表绑定到表列表,您需要一个存储过程/查询,如下所示:

    SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' ORDER BY TABLE_NAME [将架构名称更改为您的架构名称]

    //Bind your dropdown to the list of tables
    using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["dbConnString"]))
        {
            using (SqlCommand cmnd = conn.CreateCommand())
            {
                cmnd.CommandType = CommandType.StoredProcedure;
                cmnd.CommandText = "dbo.TableSelect";
    
                conn.Open();
    
                System.Text.StringBuilder sb = new System.Text.StringBuilder();
    
                using (SqlDataReader rdr = cmnd.ExecuteReader(CommandBehavior.CloseConnection))
                {
                    string _fullName;
                    while (rdr.Read())
                    {
                        _fullName = string.Format("{0}.{1}",rdr["Table_Schema"].ToString(), rdr["Table_Name"].ToString());
                        ddlTables.Items.Add(new ListItem(_fullName,_fullName));
                    }
                    ddlTables.Items.Insert(0, new ListItem("Select Table ..."));
                }
            }
        }
    

    然后你需要将你的文本框连接到一个响应 keyup 事件的 JavaScript 函数:

    //Wire up the textbox
            txtUser.Attributes.Add("onkeyup", "doLookup();");
    
    function doLookup(){
    
    }
    

    执行此操作的现代方法是使用 JQuery 的 AJaX 功能。基本上,您调用处理程序的 URL,它将返回查询结果,然后您将其绑定或输出到您的文本框 underneath 的 GUI 元素,因此它看起来有点像下拉列表。然后用户单击返回的条目之一,将其复制到文本框。

    一些处理程序代码:

        public void ProcessRequest(HttpContext context)
        {
            HttpRequest req = context.Request;
            if (string.IsNullOrEmpty(req.QueryString["qry"]) || string.IsNullOrEmpty(req.QueryString["tableName"])){
                return;//  You could return something meaningful if no sql query is passed
            }
    
    
            String sqlstr = req.QueryString["qry"];
            String tableName = req.QueryString["tableName"];
    
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
    
            using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["dbConnStr"])){
                using (SqlCommand cmnd = conn.CreateCommand())
                {
                    cmnd.CommandText = tableName + "Select";
                    cmnd.CommandType = CommandType.StoredProcedure;
                    SqlParameter pram = new SqlParameter("@qry", sqlstr);
                    pram.Direction = ParameterDirection.Input;
                    cmnd.Parameters.Add(pram);
    
                    pram = new SqlParameter("@tableName", tableName);
                    pram.Direction = ParameterDirection.Input;
                    cmnd.Parameters.Add(pram);
    
                    conn.Open();
    
                    using (SqlDataReader rdr = cmnd.ExecuteReader(CommandBehavior.CloseConnection)){
                        while (rdr.Read()){
                            sb.Append(rdr["Name"].ToString() + "<br/>"); //Modern object-oriented thing to do is build up a JSON string and return that.
                        }
                    }
    
                }
            }
    
            context.Response.ContentType = "text/plain";//or "text/JSON"
            context.Response.Write(sb.ToString());
        }
    

    祝你好运。如果您需要更多详细信息,请告诉我...

    【讨论】:

    • 谢谢,如果你明天能发帖,一定会有所帮助
    • @5arx 嗨,朋友,如果我想为 SharePoint 完成这项工作,我可以这样做吗?
    • @Jithu - 抱歉,我对 Sharepoint 开发一无所知,因此无法回答您的问题。看看这个线程:social.technet.microsoft.com/Forums/en-US/… 以获取线索或将其作为 StackOverflow 上的新问题提出(记得将其标记为“Sharepoint”)并包含指向此问题的链接?
    【解决方案2】:

    试试这个人,可能对你有帮助:http://1code.codeplex.com/

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 2012-06-12
      • 2011-01-24
      • 1970-01-01
      相关资源
      最近更新 更多