break
Feb 13

When you go to Yahoo, if you start typing in their web search, after you type several words, you end up with a window that has several options according to the search string you just entered. I was trying to simulate that effect in an asp.net webpage.

To do this I decided to use the ASP.NET AJAX TOOLKIT. I am using Visual Web Developer 2008 Express to do this, I created a new website, and started working from here.

To accomplish this you will need to:

1- Add the AjaxControlToolkit.dll to your project(Add reference -> Browse tab ). When you download the tookit you can search for this dll, and you should be able to find it.
(I found mine in this path: Visual Studio 2005\Templates\ProjectTemplates\Visual C#\AjaxControlExtenderProjectCS\AjaxControlToolkit.dll)
2- Add a webform to your project
3- Add a web service to your project
4- Add a style sheet to your project

The Webform:
I will proceed to explain several parts of the webform

Before the HTML you need to register the Ajax Control Toolkit custom control.
<%@ Register
Assembly=”AjaxControlToolkit”
Namespace=”AjaxControlToolkit”
TagPrefix=”ajaxToolkit” %>

Don’t forget to add the style sheet we are using.
<link href=”StyleSheet.css” rel=”stylesheet” type=”text/css” />

Inside the form I have the following:
First, I start adding a toolkit script manager:
<ajaxtoolkit:toolkitscriptmanager runat=”server” id=”ScriptManager1″/>
If you don’t do this you might get an error that says “The control with ID ‘AutoComplete1′ requires a ScriptManager on the page. The ScriptManager must appear before any controls that need it.”. The reason you need it (as I understand it) is that the toolkit script manager merges multiple javascript scripts into one file, which is downloaded at runtime.

Then, you need a textbox, which is where your search is going to be typed.
<asp:textbox runat=”server” id=”txtInput” width=”300″/>

Of course, you need to add in the form the ASP.NET AJAX AutoComplete Extender. According to the asp.net webpage this extender:”can be attached to any TextBox control, and will associate that control with a popup panel to display words that begin with the prefix typed into the textbox.”. This is how the extender looks in my form:
<ajaxToolkit:AutoCompleteExtender
runat=”server”
ID=”AutoComplete1″
TargetControlID =”txtInput”
ServiceMethod=”GetCustomersContactTitle”
ServicePath=”WebService.asmx”
MinimumPrefixLength=”2″
CompletionInterval=”1000″
EnableCaching=”true”
CompletionSetCount=”20″
CompletionListCssClass=”flyout-background”
CompletionListItemCssClass=”flyout-item”
CompletionListHighlightedItemCssClass=”flyout-item-hover”>
</ajaxToolkit:AutoCompleteExtender>

This is what the webform needs, nonetheless, this is very basic, because my purpose is to show how this works, and that you can also understand what everything means.

Now, I am going to write about the two most important parts of the webservice :

First, make sure this line is commented when you add your Webservice. This line needs to be uncommented, since you need to call the webservice from your webform.
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[System.Web.Script.Services.ScriptService]

Last but not least, you need a method that returns the data to be displayed. My method basically gets the ContactTitle Column in the Customers table which is located in the Northwind database. I used this database since it is available to everyone. The AJAX AutoComplete Extender requires that the method that you use to display data, matches the following signature: a method that returns an array of strings, and has two parameters, which is the prefix the user just entered, and the amount of records to be displayed.


[WebMethod]
public string[] GetCustomersContactTitle(string prefixText, int count)
{
List<string> items = new List<string>(count);
DataSet ds = new DataSet();string connectionString = "Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI;";
using(SqlConnection connection = new SqlConnection(connectionString))
{
string sql = "SELECT ContactTitle FROM Customers WHERE ContactTitle LIKE '" + prefixText + "%'";
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(sql,connection);
adapter.Fill(ds);
}
foreach (DataRow dr in ds.Tables[0].Rows)
{
items.Add(dr["ContactTitle"].ToString());
}
return items.ToArray();
}

Finally, the stylesheet, to have a better understanding on the CSS Classes I would recommend that you play with them, so you have a better understanding on what they do. Nonetheless, I provided a description of what they do.

This class is going to be applied to the completion list flyout.
.flyout-background {
border: 1px solid #009;
list-style-type: none;
margin: 0px;
background-color: #FFFFFF;
text-align: left;
}

This class is going to be applied to an item in the AutoComplete list flyout.
.flyout-item {
color: #FF0000;
}

This class is going to be applied to a highlighted item in the AutoComplete list flyout.
.flyout-item-hover {
background-color: #66FFFF;
}

This is the final result:

Here’s a copy of my files

If you have any comments just let me know.

Feb 2

I am currently using a computer with a Windows 2003 Server Operating System. It took me about 15 minutes to get to the login screen. When I was finally able to log into my profile, I checked the Event Viewer and saw the following error:

The device, \Device\Harddisk0, has a bad block.

I was able to fix this doing the following:

  • Do a right click on your C: drive.
  • Select properties
  • Click on the Tools tab, in the Error-Checking section click the “Check Now” button.
  • Error-Checking

  • Select all the Check disc options and press start.

After I did all this I got the following message: “The disk check could not be performed because the disk check utility needs exclusive access to some Windows files on the disk. These files can be accessed only by restarting Windows. Do you want to schedule this disk check to occur the next time you restart the computer?” press “Yes” and the next time you restart your computer a CHKDSK (Checkdisk) is going to be performed. This fixed my problem.

If you have another way of fixing this problem, please let me know.