您的位置:首页 > 编程语言 > ASP

asp.net 站内搜索功能的实现及利用datatable绑定数据并进行分页

2015-09-16 11:21 1146 查看
最近在做公司网站的时候,用到了站内搜索,之前没做过,经过几天的研究和百度,GOOGLE,基本实现了我想达到的效果,在这里记录一下,写的比较乱,有时间再整理一下

首先先看图,



要实现上图的搜索功能,包含全站搜索,按不同的模块搜索。在做的时候,我先用的JQ的AJAX方法,从前台获取输入的值,传递到后台进行处理,后来发现,在后台有静态方法的情况下,能获取到控件但控件赋不了值,所以查出来的数据无法通过repeater绑定,只有通过JQ 处理返回数据绑定,这为后续工作带来很多不遍,所以还是把搜索按钮换成了服务器控件,在Button事件里操作!

首先来整理一下思路,要实现全部搜索功能,就要用到SQL的多表查询,模块搜索,只需要查询对应的分类就可以了,那么问题来了:

1、多表查询如何实现

2、查出来的数据怎么分类

3、怎么在点击的时候让他跳转到对应的模块分类下

针对上面几个问题,一一分析解决:(我做的时候走了很多弯路,浪费了很多时间,不断的改,不断的调,才达到我要的效果。)

问题1:

第一个问题是多表查询,这个不难,通过百度搜索后,有很多种方式,最后我选择了用union all做链接,进行多表查询



问题2:

第二个问题是如何对查出来的数据进行分类,我这里用是给每个增加了一个type字段做为索引,如上图

问题3:

问题2解决了,那么问题3就很好做了,只需判断type就可以知道是哪个模块的了

下面贴代码:

由于数据库设计的比较乱,字段不统一,命名不统一,所以出现了很多的重复绑定和判断,我会尽量加注释

下面完整代码

  声明的静态变量

public static int numb; //存放查询出来的记录数
public static DataTable sdt = new DataTable();//存放datatable表记录


public void bindSearch(int typeid,string keys)
{

try
{
string sql="";
switch (typeid)
{
case 0:
sql = "select 1 type,Id,Title,ClassId,Imgurl,Addtime from [Food] where Title like '%" + keys + "%' ";
sql = sql+" union all select 2 type,Id,Title,ClassId,Imgurl,Addtime from [news] where Title like '%"+keys+"%'";
sql = sql + " union all select 3 type,Id,Title,TypeId,Imgurl,Addtime from ZLive where Title like '%" + keys + "%'";
break;
case 1:
sql = "select 1 type,Id,Title,ClassId,Imgurl,Addtime,Name from [Food] where Title like '%" + keys + "%' ";
break;
case 2:
sql = "select 2 type,Id,Title,TypeId,ImgUrl,Addtime from ZLive where Title like '%" + keys + "%' ";
break;
default:
sql = "select 3 type,Id,Title,TypeId,ImgUrl,Addtime from ZLive where Title like '%" + keys + "%' ";
}
DataTable dt = new DataTable("datatable");//创建虚拟Datatable表
//向表内添加列
dt.Columns.Add("tid", typeof(System.Int32));  //索引标题ID
dt.Columns.Add("title", typeof(System.String)); //标题
dt.Columns.Add("id", typeof(System.Int32));  //ID
dt.Columns.Add("typeid", typeof(System.Int32)); //分类ID
dt.Columns.Add("imgurl", typeof(System.String));
dt.Columns.Add("addtime", typeof(System.DateTime));//时间
dt.Columns.Add("linkurl", typeof(System.String)); //要跳转的URL链接
DataSet ds = new DataSet();
ds = DB.dataSet(sql); //查询数据库,返回dataset,这里我返回的是dataset,也可以根据自己的需要返回相应数据
if (ds.Tables[0].Rows.Count != 0) //判断ds是否有数据
{ DataRow row; string linkurl = null; //用于存放组合的URL链接
int ids = 0, tids = 0; //循环读出数据放进datatable
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
//取得当前模块分类标识
int d = Convert.ToInt32(ds.Tables[0].Rows[i]["type"]);
switch (d)
{
case 1:
ids = Convert.ToInt32(ds.Tables[0].Rows[i]["Id"]);
linkurl = "/food/Btnr.aspx?pid=" + ids + "&pname=" + ds.Tables[0].Rows[i["Name"].ToString() + ""; //组合URL链接
break;
case 2:
ids = Convert.ToInt32(ds.Tables[0].Rows[i]["Id"]);
linkurl = "/News/Newsn.aspx?id=" + ids; //组合URL链接
break;
case 3: ids = Convert.ToInt32(ds.Tables[0].Rows[i]["Id"]);
tids = Convert.ToInt32(ds.Tables[0].Rows[i]["ClassId"]);
//同一模块下,根据不同的分类,跳转到不同的页面
if (tids == 4 || tids == 6)
{
linkurl = "/zhu/fdetails.aspx?tid=" + tids + "&id=" + ids + "";//组合URL链接
}
else {
linkurl = "/zhu/zdetails.aspx?tid=" + tids + "&id=" + ids + "";//组合URL链接
} break;
}
//把数据放进datatable行
row = dt.NewRow();
row["tid"] = d;
row["title"] = Convert.ToString(ds.Tables[0].Rows[i]["Title"]);
row["id"] = ids;
row["typeid"] = tids;
row["imgurl"] = Convert.ToString(ds.Tables[0].Rows[i]["Imgurl"]);
row["addtime"] = Convert.ToString(ds.Tables[0].Rows[i]["Addtime"]);
row["linkurl"] = linkurl; dt.Rows.Add(row); }
} 
//将DataTable表记录数放进静态变量,分页时获取
                  numb = Convert.ToInt32(dt.Rows.C
4000
ount);
                  sdt = dt; //将DataTable表 dt存进静态datatable表sdt,分页时获取
bindinfo(1);//调用方法绑定repeater并进行分页
} catch (Exception)
{ }
}
这里分页我用的是AspNetPager控件

void bindinfo(int current)
{
AspNetPager1.RecordCount = numb;//从静态变量numb里获取datatable的记录数(由于点击下一页时还要调用此方法,而这时候页面已刷新,datatable已为空,所以我事先把datatable和总记录数存进了静态变量)
int begin = (current - 1) * AspNetPager1.PageSize;
int size = AspNetPager1.PageSize;

DataTable dst = new DataTable();
//调用datatable的分页方法,返回分页后的datatable表dst,
dst = GetPagedTable(sdt, current, size); //sdt为静态datatable表(sdt已事已存入),current为当前页码,size为要分页的数量
rptsearch.DataSource = dst; //repeater绑定分页后的datatable
rptsearch.DataBind();
}
protected void AspNetPager1_PageChanging(object src, Wuqi.Webdiyer.PageChangingEventArgs e)
{
bindinfo(e.NewPageIndex);
}

/// <summary>
/// datatable分页方法
/// </summary>
/// <param name="dt">为要进行分页的datatable</param>
/// <param name="PageIndex">当前页索引(页码)</param>
/// <param name="PageSize">分页数</param>
/// <returns></returns>
public DataTable GetPagedTable(DataTable dt, int PageIndex, int PageSize)
{
if (PageIndex == 0)
return dt;
DataTable newdt = dt.Clone();
//newdt.Clear();
int rowbegin = (PageIndex - 1) * PageSize;
int rowend = PageIndex * PageSize;
if (rowbegin >= dt.Rows.Count)
return newdt;
if (rowend > dt.Rows.Count)
rowend = dt.Rows.Count;
for (int i = rowbegin; i <= rowend - 1; i++)
{
DataRow newdr = newdt.NewRow();
DataRow dr = dt.Rows[i];
foreach (DataColumn column in dt.Columns)
{
newdr[column.ColumnName] = dr[column.ColumnName];
}
newdt.Rows.Add(newdr);
}
return newdt;
}


datatable分页方法GetPagedTable()是从网上找的,地址:http://www.cnblogs.com/chenxu4277/archive/2009/02/03/1383312.html

前台绑定

<div class="listbox">
<asp:Repeater ID="rptsearch" runat="server">
<ItemTemplate>
<dl>
<dt><a href="<%#Eval("linkurl")%>" title="<%#Eval("title") %>" target="_blank"><img src="<%#Eval("imgurl") %>" alt="<%#Eval("title") %>" onerror="javascript:this.src='/images/img_04_05.jpg'"/></a></dt>
<dd><a href="<%#Eval("linkurl")%>" title="<%#Eval("title") %>" target="_blank"><%#Eval("title") %></a></dd>
<dd><i><%#Eval("addtime") %></i></dd>
</dl>
</ItemTemplate>
</asp:Repeater>
</div>


listbox的样式文件就不在贴了,效果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息