Introduction
This is very simple code which makes an Auto Complete Combo with database.
It's useful. First of all, you do not have to know about Ajax functions, just download the AJAX Control Toolkit on CodePlex and follow me, then enjoy. Besides when there are many rows, you can type part of the word in the text box, then it can offer all of the words which are similar to it.
Background: What is Ajaxcontroltoolkit?
The ASP.NET AJAX Control Toolkit is an open-source project built on top of the Microsoft ASP.NET AJAX framework and contains more than 30 controls that enable you to easily create rich, Interactive web pages. If you want to know more about it, visit this link.
Using the Code
It the first step, you must download AjaxControlToolkit from here for .NET 3.5 OR here for .NET 4.0.
You must go here and download ajaxcontroltoolkit, then Copy ajaxcontroltoolkit and paste them to Bin Folder, right click on solution, choose Add Reference, in the browse tab double click on the Bin Folder, and double click on ajaxcontroltoolkit, then on the Build Menu > click Rebuild.
DataBase
New Query
CREATE TABLE [dbo].[tblCustomer](
[CompanyName] [nvarchar](500) NULL,
[ID] [int] IDENTITY(1,1) NOT NULL
) ON [PRIMARY]
insert into dbo.tblCustomer(CompanyName) values('calemard')
insert into dbo.tblCustomer(CompanyName) values('dantherm')
insert into dbo.tblCustomer(CompanyName) values('dango dienenthal')
insert into dbo.tblCustomer(CompanyName) values('daewoo')
insert into dbo.tblCustomer(CompanyName) values('daim engineering')
Visual Studio 2008 - .NET 3.5: Create Web Site and name it AutoComplete, create Web Form and name it AutoComplete.aspx, in HTML view, write this code.
But there is a little difference between C# and VB in this section.
- This code in the bottom is for C# coders.
- If you are a VB coder, please modify 2 sections in page tag
- One: correct
language=VB
- Two: correct
CodeFile="AutoComplete.aspx.vb"
<%@ Page Language="C#" AutoEventWireup="false"
CodeFile="AutoComplete.aspx.cs" Inherits="AutoComplete" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit"
TagPrefix="ajaxToolkit" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>AutoComplete</title>
<link href="StyleSheet.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<ajaxToolkit:ToolkitScriptManager ID="ScriptManager1" runat="server">
</ajaxToolkit:ToolkitScriptManager>
<ajaxToolkit:AutoCompleteExtender ID="autoComplete1" runat="server"
EnableCaching="true"
BehaviorID="AutoCompleteEx"
MinimumPrefixLength="2"
TargetControlID="myTextBox"
ServicePath="AutoComplete.asmx"
ServiceMethod="GetCompletionList"
CompletionInterval="1000"
CompletionSetCount="20"
CompletionListCssClass="autocomplete_completionListElement"
CompletionListItemCssClass="autocomplete_listItem"
CompletionListHighlightedItemCssClass="autocomplete_highlightedListItem"
DelimiterCharacters=";, :"
ShowOnlyCurrentWordInCompletionListItem="true">
<Animations>
<OnShow>
<Sequence>
<%----%>
<OpacityAction Opacity="0" />
<HideAction Visible="true" />
<%----%>
<ScriptAction Script="// Cache the size and setup the initial size
var behavior = $find('AutoCompleteEx');
if (!behavior._height) {
var target = behavior.get_completionList();
behavior._height = target.offsetHeight - 2;
target.style.height = '0px';
}" />
<%----%>
<Parallel Duration=".4">
<FadeIn />
<Length PropertyKey="height" StartValue="0"
EndValueScript="$find('AutoCompleteEx')._height" />
</Parallel>
</Sequence>
</OnShow>
<OnHide>
<%----%>
<Parallel Duration=".4">
<FadeOut />
<Length PropertyKey="height" StartValueScript=
"$find('AutoCompleteEx')._height" EndValue="0" />
</Parallel>
</OnHide>
</Animations>
</ajaxToolkit:AutoCompleteExtender>
<asp:TextBox ID="myTextBox" autocomplete ="off" runat="server"></asp:TextBox>
</form>
</body>
</html>
For StyleSheet (CSS file)
- Create StyleSheet: Solution > Right Click > Add New Item > Web Service >
- Name: StyleSheet.css
- Language: Visual Basic OR C#
- Go To > StyleSheet.css (File) > Ctrl+A (Select All) > Delete
- Go to this section (below) > Select this code > Ctrl+C >
- Go To StyleSheet.css (file) > Ctrl+V (paste)
.autocomplete_completionListElement
{
margin : 0px!important ;
background-color : inherit ;
color : windowtext ;
border : buttonshadow ;
border-width : 1px ;
border-style : solid ;
cursor : 'default' ;
overflow : auto ;
height : 200px ;
font-family : Tahoma ;
font-size : small ;
text-align : left ;
list-style-type : none ;
}
.autocomplete_highlightedListItem
{
background-color : #ffff99 ;
color : black ;
padding : 1px ;
}
.autocomplete_listItem
{
background-color : window ;
color : windowtext ;
padding : 1px ;
}
For VB
- Create Web Service: Solution > Right Click > Add New Item > Web Service >
- Name: AutoComplete.asmx
- Language: Visual Basic
- Go To >
App_Code
> AutoComplete.vb
Imports System
Imports System.Collections
Imports System.Linq
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Xml.Linq
Imports System.Collections.Generic
Imports System.Data
Imports System.Data.SqlClient
<System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
Public Class AutoComplete
Inherits System.Web.Services.WebService
Dim cn As New SqlClient.SqlConnection()
Dim ds As New DataSet
Dim dt As New DataTable
<WebMethod()> _
Public Function GetCompletionList(ByVal prefixText As String, _
ByVal count As Integer) As String()
Dim strCn As String = _
"data source=.;Initial Catalog=MyDB;Integrated Security=True"
cn.ConnectionString = strCn
Dim cmd As New SqlClient.SqlCommand
cmd.Connection = cn
cmd.CommandType = CommandType.Text
cmd.CommandText = "select * from tblCustomer Where CompanyName like @myParameter"
cmd.Parameters.AddWithValue("@myParameter", "%" + prefixText + "%")
Try
cn.Open()
cmd.ExecuteNonQuery()
Dim da As New SqlDataAdapter(cmd)
da.Fill(ds)
Catch ex As Exception
Finally
cn.Close()
End Try
dt = ds.Tables(0)
Dim txtItems As New List(Of String)
Dim dbValues As String
For Each row As DataRow In dt.Rows
dbValues = row("CompanyName").ToString()
dbValues = dbValues.ToLower()
txtItems.Add(dbValues)
Next
Return txtItems.ToArray()
End Function
End Class
For C#
- Web Service: Solution > Right Click > Add New Item > Web Service >
- Name: AutoComplete.asmx
- Language: C#
- Go To >
App_Code
> AutoComplete.cs
using System;
using System.Collections;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class AutoComplete : System.Web.Services.WebService {
public AutoComplete () {
}
[WebMethod]
public string[] GetCompletionList(string prefixText, int count)
{
SqlConnection cn =new SqlConnection();
DataSet ds = new DataSet();
DataTable dt = new DataTable();
String strCn = "data source=.;Initial Catalog=MyDB;Integrated Security=True";
cn.ConnectionString = strCn;
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select * from tblCustomer Where CompanyName like @myParameter";
cmd.Parameters.AddWithValue("@myParameter", "%" + prefixText + "%");
try
{
cn.Open();
cmd.ExecuteNonQuery();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds);
}
catch
{
}
finally
{
cn.Close();
}
dt = ds.Tables[0];
List<string> txtItems =new List<string>();
String dbValues;
foreach (DataRow row in dt.Rows)
{
dbValues = row["CompanyName"].ToString();
dbValues = dbValues.ToLower();
txtItems.Add(dbValues);
}
return txtItems.ToArray();
}
}
Summary
GetCompletionList
is a function that catches 2 arguments, prefixText
as string
and count
as int
.
When you type some characters, they are saved in prefixText
and number of your characters are saved in count
. And at the end, function returns list of string
(they are similar to your characters) which has been obtained as follows:
I have written some code in ADO.NET section, these rows have been filtered by prefixText
, which are similar to your characters that are typed in text box.
Additionally, I defined a parameter instead of passing value directly to prevent SQL injection.
I create txtItems
in List
of string
data type, we can save words that we want. Then in a foreach
loop, I converted them into tolower
, I added those values to my result value (txtItems
), finally I return txtItems
.
Try Step by Step
- Go here for .NET 3.5 OR here for .NET 4.0 and download the
AjaxControlToolkit
file. - Copy the folder "AjaxControlToolkit.Dll" and all dependers, there are 18 objects, to your web site Bin folder (C:\AutoComplete\Bin).
- Right click on solution, choose refresh, then right click again and click add reference, then in the browse tab double click on the Bin Folder, and double click on ajaxcontroltoolkit, on the Build Menu > click Rebuild.
- Create database and tables like above, and add some rows which have common words.
- Create Web Form and name it: "AutoComplete.aspx". In the HTML view, write some code like above. (This should be exactly like my code because this section is case sensitive).
- Create a webservice:
Solution > Right Click > Add New Item > Web Service > Name: AutoComplete.asmx Language: C# or VB
Go To > App_Code > AutoComplete.cs - For some animation effect, I added Stylesheet, use it for user friendly.
- If you are a VB coder, use the VB sample, otherwise use the C# sample.
- Run the program and write in Text Box a word that contains 2 characters or more such as
da
, and you will see a list of words that are similar to your character.
Feedback
Feel free to leave any feedback on this article; it is a pleasure to see your comments and vote about this code. If you have any questions, please do not hesitate to ask me here.