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就可以知道是哪个模块的了
下面贴代码:
由于数据库设计的比较乱,字段不统一,命名不统一,所以出现了很多的重复绑定和判断,我会尽量加注释
下面完整代码
声明的静态变量
datatable分页方法GetPagedTable()是从网上找的,地址:http://www.cnblogs.com/chenxu4277/archive/2009/02/03/1383312.html
前台绑定
listbox的样式文件就不在贴了,效果如下:
首先先看图,
要实现上图的搜索功能,包含全站搜索,按不同的模块搜索。在做的时候,我先用的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的样式文件就不在贴了,效果如下:
相关文章推荐
- 分享微信开发Html5轻游戏中的几个坑
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- 本人即将筹备败家日志,敬请期待!
- IE:使用搜索助手
- 星外ASP.Net的安全设置相关说明
- C#、ASP.NET通用扩展工具类之TypeParse
- C#实现Datatable排序的方法
- C#、ASP.NET通用扩展工具类之LogicSugar
- C#从DataTable获取数据的方法
- C#、ASP.NET通用工具类IsWhat?(可以判断数字、身份证、数据类型等等)
- c# 如何将RadioButton与DataTable数据进行绑定
- 程序中常用的种代码
- ASP.NET、ASP、PHP、JSP之间有什么区别?
- ASP.NET页面间的传值的几种方法
- C++深度优先搜索的实现方法
- C#使用DataSet Datatable更新数据库的三种实现方法
- C# DataTable的详细用法分享
- 入侵ASP.net网站的经验附利用代码
- 基于文本的搜索
- php实现搜索一维数组元素并删除二维数组对应元素的方法