很久没写代码了,也很久不写技术文了,不知道该从何写起,本文将会有点乱,请见谅。
本文的内容是要实现一个类似ComboBox的功能,也可以说是类似Google的输入提示和自动完成,其实这样的文章网上也不少,只是在下愚笨,几乎没从众多中文文章中受益,倒是从一些E文文章里有不少的收益,最终实现了想要的效果,小庆祝一下……
上图就是最终的效果图,文章最后将会附上整个源码的下载。
本功能主要是借助FlexBox这个基于JQuery的开源项目:
FlexBox Home Page:http://www.fairwaytech.com/Technology/FlexBox.aspx
FlexBox Live Demos:http://www.fairwaytech.com/Technology/FlexBoxDemo.aspx
进入正题,如果你也想试试,那就跟我一起来。
本示例使用的是Northwind数据库,如果你的SQL Server中没有,也可以改成你自己的随便什么数据库,或者Google.com.hk去下一个Northwind数据库。
数据库准备好后就该准备本文的关键工具,FlexBox。你可以从Home Page中找到下载的链接,但是从那里下载的包中并不包含JQuery基础框架,你需要自行准备,而且,官方包中还有一个小bug(后面会提到),所以我建议大家直接使用我提供的代码。点击这里下载FlexBox
下面开始项目:
打开Visual Web Develop 2008,新建一个项目,命名为FlexBoxTest。
在项目中先添加一个新建项,模板选择“数据集”(你也可以使用你自己的方法,这里只是要连接数据库并获取取数据),因为是示例,所以直接使用默认命名DataSet1.xsd即可。
在新建的数据集中添加一个TableAdapter,按照配置向导一步一步建立数据库连接(这段应该可以省略),最后添加一个表以作测试(本例添加Empolyee表)。
为了保证文本提示功能的准备性和易用性,这里我们要新建一个查询(Query),新建查询要带有一个Where子句,内容为:where FirstName like @key+'%',可以把这个查询命名为GetDataByKey。
对DataSet1.xsd进行保存。
下面进行页面编写:
先把FlexBox目录解压到项目中,然后在Default.aspx页面的<head></head>中添加如下内容:
< script src ="FlexBox/js/jquery.flexbox.js" type ="text/javascript" ></ script >
< link href ="FlexBox/css/jquery.flexbox.css" rel ="stylesheet" type ="text/css" />
接下来在<body></body>中添加两个<div>,内容如下:
< div id ="ffb9-result" style ="clear:both" ></ div >
其中,ffb9是要显示文本框的,而ffb9-result则是要显示操作的结果。
然后在页面中添加JS代码,可以写到<body>中,也可以写到<head>中,内空如下:
$().ready( function () {
$( ' #ffb9 ' ).flexbox( ' Results.aspx ' , {
autoCompleteFirstMatch: false ,
noResultsText: '' ,
onSelect: function () {
$( ' #ffb9-result ' )
.html( ' You selected " ' + this .value + ' ", ' +
' which has a hidden value of ' +
this .getAttribute( ' hiddenValue ' ));
}
});
$( ' #ffb9_input ' ).blur( function () {
$( ' #ffb9-result ' )
.html( ' The value passed when the form is ' +
' submitted is " ' + this .value + ' " ' );
});
});
</ script >
注意,这里引入了一个Results.aspx文件,这个文件就是要提供输入提示的内容的。
到这里,Default.aspx中的内容已经编写完毕,接下来,我们就要新建一个Results.aspx文件。
在介绍Results.aspx中的内容前,先简单介绍一下FlexBox的基本工作原理(详细内容在FlexBox Home Page中都能找到):
FlexBox对文本框进行提示的依据就是要通过另外一个符合JSON结构的文本中来实现,所谓JSON结构,Google.com.hk中会找到,而FlexBox对文本结构有特定的要求,具体如下:
{"id":"2","name":"Andrew"},
{"id":"9","name":"Anne"}
]}
所以,我们要让Results.aspx返回如上形式的JSON结构的内容。
Results.aspx文件中不需要写入任何内容,而是要在Results.aspx.cs文件中编码:
当然,要先进行必要的引用:
using System.Text;
using System.Web.Script.Serialization;
然后写入两个新类(可以写到Results.aspx.cs中,也可以新建类文件):
public class FlexBoxItem
{
string _id = string .Empty;
string _name = string .Empty;
/// <summary>
/// get/set id of flex box item
/// </summary>
public string id
{
get { return _id; }
set { _id = value; }
}
/// <summary>
/// get/set name of flex box item
/// </summary>
public string name
{
get { return _name; }
set { _name = value; }
}
/// <summary>
/// constructor with id and name as parameters
/// </summary>
/// <param name="fid"></param>
/// <param name="fname"></param>
public FlexBoxItem( string flexbox_id, string flexbox_name)
{
_id = flexbox_id;
_name = flexbox_name;
}
}
[Serializable()]
public class FlexBoxResult
{
List < FlexBoxItem > _results = null ;
/// <summary>
/// get/set flexbox item list
/// </summary>
public List < FlexBoxItem > results
{
get { return _results; }
set { _results = value; }
}
/// <summary>
/// constructor with flexbox item list
/// </summary>
/// <param name="_list"></param>
public FlexBoxResult(List < FlexBoxItem > _list)
{
_results = _list;
}
}
接下来要在Results类中写入如下代码:
{
private DataSet1TableAdapters.EmployeesTableAdapter _EmployeeTableAdapter = null ;
private DataSet1TableAdapters.EmployeesTableAdapter Adapter
{
get
{
if (_EmployeeTableAdapter == null )
{
_EmployeeTableAdapter = new FlexBoxTest.DataSet1TableAdapters.EmployeesTableAdapter();
}
return _EmployeeTableAdapter;
}
}
protected void Page_Load( object sender, EventArgs e)
{
// q=a&p=1&s=10&contentType=application/json; charset=utf-8
DataSet1.EmployeesDataTable etb = new DataSet1.EmployeesDataTable();
if (Request.QueryString[ " q " ] == null )
{
etb = Adapter.GetData();
}
else
{
etb = Adapter.GetDataByKey(Request.QueryString[ " q " ].ToString());
}
List < FlexBoxItem > _flexList = new List < FlexBoxItem > ();
foreach (DataSet1.EmployeesRow dr in etb.Rows)
{
_flexList.Add( new FlexBoxItem(dr[ " EmployeeID " ].ToString(), dr[ " FirstName " ].ToString()));
}
FlexBoxResult _flexBoxResult = new FlexBoxResult(_flexList);
JavaScriptSerializer _jss = new JavaScriptSerializer();
StringBuilder _jsonResult = new StringBuilder();
_jss.Serialize(_flexBoxResult, _jsonResult);
Response.ContentType = " application/json " ;
Response.Write(_jsonResult.ToString());
Response.End();
}
}
到此,就一切OK了,生成项目,并运行Default.aspx,你将会看到想要的结果。
下面提供本示例完整的源码下载:FlexBoxTest.zip
最后说一下FlexBox中的一个bug,就是文本框中无法输入小写字母q,在本例中已经修正了这个问题。
有事先闪,回头再来完善。