2011-02-22 71 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