2011-02-22 77 views
2

我想创建一个自动完成的文本框使用jQuery将被绑定到SQL数据库。我还希望在页面上放置一个下拉列表,以便根据初始选择自动完成文本框从不同的表中检索数据。这是一个ASP.NET 2.0页面,后面的代码是VB.NET。我有AJAX自动完成工作,但它只匹配第一个字符,它不像jQuery那样健壮。任何人都可以共享一个示例代码,它将从SQL中检索搜索数据,并为我提供有关如何使表名称变为动态的说明?自动完成jQuery和SQL,ASP.NET

任何帮助是极大的赞赏

沃尔玛

回答

4

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

看看这个 .NET AJAX Calls to ASMX or ASPX or ASHX?对于使用ScriptService的稍微更现代的方法 - 基本思想是一样的。

如果需要的话(它的v.late)我会后的代码明天,

H个。

编辑:

在最简单的(你会明白参与做一些更复杂的,当您去的问题),让我们来想象你有三个表:用户产品

表:用户
ID INT
用名字VARCHAR(50)
姓VARCHAR(50)
DATEOFBIRTH日期时间

表:系
ID INT
名称VARCHAR

表:产品
ID INT
名称VARCHAR

而且你需要3个存储过程由名称的一部分选择:

存储过程的产品和部门的形式是一样的:

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 EV JavaScript函数ent:

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

function doLookup(){ 

} 

现在这样做的方法是使用JQuery的AJaX功能。基本上,您可以调用处理程序的URL,它将返回查询结果,然后将结果绑定或输出到您的文本框中的下的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()); 
    } 

好运。让我知道如果你需要任何更多的细节......

+0

谢谢你,肯定会是有益的,如果你可以将它张贴明天 – Martyn 2011-02-23 00:18:23

+0

辉煌,非常感谢,我会给它一个 – Martyn 2011-02-23 22:39:05

+0

没问题,希望这是你之后的事情。 – 5arx 2011-02-23 23:05:48