C# List 分页查询怎么实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# List 分页查询怎么实现相关的知识,希望对你有一定的参考价值。
list中有10条数据,然后进行分页查询,每页查询5条,这里的list就像数据库一样。
求解决!!!
List<String> list =new List<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
......
在C# windform中实现。。。
/**
* 分页方法
*@returnType:List<Object>
* @param list 源数据
* @param currentPage 当前页
* @param maxNum 每页显示几条
* @param pageNum 总页数
* @return
*/
public static List getPageList(List list,int currentPage,int maxNum,int pageNum)
int fromIndex = 0; //从哪里开始截取
int toIndex = 0; //截取几个
if(list == null || list.size() == 0)
return null;
//当前页小于或等于总页数时执行
if( currentPage <= pageNum && currentPage != 0)
fromIndex = (currentPage - 1)*maxNum;
if(currentPage == pageNum)
toIndex = list.size();
else
toIndex = currentPage*maxNum;
return list.subList(fromIndex, toIndex);
追问
C#中没有 list.subList()这个方法
追答狂汗!!!!!!那就自己实现啊...把return list.subLIst这行换成下面的代码
List temp = new List();
for(int i=fromIndex;i<toIndex;i++)
temp.add(list.get(i));
return temp;
//页数
int PageNum=2;
//每一页多少条数据
int Record=5;
//pageList是某一页的数据
var pageList=list.Skip(Record * (PageNum - 1)).Take(Record);
跟是bs和cs是无关的 参考技术B 用一个全局变量记录list下标可以实现吧 参考技术C 代码如下:
1 public partial class XTeacherFinder
2
3 private string m_TeacherId = string.Empty;
4
5 public string TeacherId
6
7 get return m_TeacherId;
8 set this.m_TeacherId = value;
9
10
11 private string m_TeacherName = string.Empty;
12
13 public string TeacherName
14
15 get return this.m_TeacherName;
16 set this.m_TeacherName = value;
17
18
19 public XTeacherFinder()
20
21
22
23
24 /// <summary>
25 /// 通过ID查找
26 /// </summary>
27 /// <param name="teacher"></param>
28 /// <returns></returns>
29 public bool FindTeacherById(XTeacher teacher)
30
31 return m_TeacherId == teacher.Id;
32
33
34 /// <summary>
35 /// 通过名称查找
36 /// </summary>
37 /// <param name="teacher"></param>
38 /// <returns></returns>
39 public bool FindTeacherByName(XTeacher teacher)
40
41 return m_TeacherName == teacher.Name;
42
43
44 /// <summary>
45 /// 通过ID和名称查找
46 /// </summary>
47 /// <param name="teacher"></param>
48 /// <returns></returns>
49 public bool FindTeacherByIdAndName(XTeacher teacher)
50
51 return (m_TeacherName == teacher.Name && m_TeacherId == teacher.Id);
52
53 参考技术D int pageNum=1; //当前页
int ListPageIndex=0; //List中的下标
ListPageIndex=(pageNum-1)*5; //当前页第一条的下标
for(int i=0;i<5;i++)
Console.WriteLine(list[ListPageIndex+i].toString());
PS:你每次翻页,需要传入 PageSize
下一页就是 +1
上一页就是 -1
poscms基于list标签实现的查询分页功能
poscms系统本身有一个在查询页(search页面)实现的查询分页功能,基于系统封装的php函数dr_search_url()
但是今天的需求除了导航栏、列表页、详情页都实现查询功能外,关键是有两个不同的模块,模块不同,如果用
系统的search的话,那就得弄两个search页面出来,其实搜索结果页面完全就是照搬列表页,所以,我为什么不
直接用列表页作为模板呢,不去走系统的search控制器。下面上列表页:
1.筛选条件的获取以及查询页的路径拼接
<div class="paixu"> <span>排序方式:</span>
<a class="xuanxiang active" href="javascript:search(‘starttime‘);">装载日期</a>
<a class="xuanxiang" href="javascript:search(‘cyl‘);">承运量从高到低</a>
<a class="xuanxiang" href="javascript:search(‘cyl_desc‘);">承运量从低到高</a>
<a class="xuanxiang" href="javascript:search(‘you‘);">有效天数</a> </div> <script type="text/javascript" charset="utf-8"> function search(order){ var rtype = $(".rtype").val(); var cylf = $(".cylf").val()?$(".cylf").val():0; var cylt = $(".cylt").val()?$(".cylt").val():9999999999; var from = $(".from").val()?$(".from").val():""; var to = $(".to").val()?$(".to").val():""; var title = $(".title").val()?$(".title").val():""; var starttimef = $("#txtBeginDate").val()?parseInt(new Date($("#txtBeginDate").val()).getTime())/1000:0; var starttimet = $("#txtEndDate").val()?parseInt(new Date($("#txtEndDate").val()).getTime())/1000:9999999999; window.location.href = "/index.php?s=goodsplate&c=category&id=2"+"&rtype="+rtype+"&cylf="+cylf+
"&cylt="+cylt+"&from="+from+"&to="+to+"&title="+title+"&starttimef="+
starttimef+"&starttimet="+starttimet+"&order="+order; }; </script>
页面是前端小姐姐写的,日历点击之后,获取的值为字符串 2018-08-27 的形式,我得要把它转成 int 型的时间戳
才能用于后面的查询比较;
看到那些三元表达式后面flase赋值为0或者9999999999么,这是根据该字段在数据库中的实际值范围而取的,数据
库中时间戳为10位数,所以我这里设置了一个不选定时间上限时的查询条件值(9999999999);
另外,当前列表页路由是 /index.php?s=goodsplate&c=category&id=2 ,所以可以看出js将查询条件直接提交到当前
页面;
当点击不同排序条件时,将执行对应的函数,此时将排序条件通过函参的方式拼接到路径中;
2.php脚本获取地址栏查询条件参数
点击查询条件之后,将跳转到拼有查询条件的路由(不难看出还是这个列表页),接下来通过php脚本获取地址栏参数
先来看路径(出货港、卸货港、货品名称没有填):
/index.php?s=goodsplate&c=category&id=2
&rtype=%E5%86%85%E6%B2%B3&cylf=2&cylt=9999999999&from=&to=&title=
&starttimef=1535328000&starttimet=1535673600&order=cyl_desc
所以,你可以很直观地看到一些筛选条件(分类-内盒、承运量范围-2~9999999999、装载日期范围-1535328000~
15356736000、排序方式-承运量降序)
<?php $data = $_GET; $rtype = $data[‘rtype‘]?$data[‘rtype‘]:null; $cylf = $data[‘cylf‘]?$data[‘cylf‘]:0; $cylt = $data[‘cylt‘]?$data[‘cylt‘]:9999999999; $from = $data[‘from‘]?$data[‘from‘]:null; $to = $data[‘to‘]?$data[‘to‘]:null; $title = $data[‘title‘]?$data[‘title‘]:null; $starttimef = $data[‘starttimef‘]?$data[‘starttimef‘]:0; $starttimet = $data[‘starttimet‘]?$data[‘starttimet‘]:9999999999; $order = $data[‘order‘]?$data[‘order‘]:null; ?>
注:poscms的list标签查询的时候,对于查询条件值为null的会过滤掉,也就是不会写到sql里去。
3.list标签查询
在上面的脚本后面,就需要根据拿到的条件来写list标签的语法了:
{list action=module module=goodsplate
rtype=$rtype LIKE_title=%$title% LIKE_from=%$from% LIKE_to=%$to%
BW_cyl=$cylf,$cylt BW_starttime=$starttimef,$starttimet
order=$order
catid=2 pagesize=12 page=1} ...... {/list}
中间加粗的字体就是查询的主要条件,用到了模糊查询(LIKE_)、范围查询(BW_)和排序(order)
这样就根据条件实现了list标签的了查询,顺便来看一下生成的sql:
SELECT * FROM `imt_1_goodsplate` WHERE
`imt_1_goodsplate`.`rtype` = "内河" AND
`imt_1_goodsplate`.`title` LIKE "%%" AND
`imt_1_goodsplate`.`from` LIKE "%%" AND
`imt_1_goodsplate`.`to` LIKE "%%" AND
`imt_1_goodsplate`.`cyl` BETWEEN 2 AND 9999999999 AND
`imt_1_goodsplate`.`starttime` BETWEEN 1535328000 AND 1535673600 AND
`imt_1_goodsplate`.`catid` = 2 AND
`imt_1_goodsplate`.`status` = 9
ORDER BY `imt_1_goodsplate`.`cyl` DESC
LIMIT 0,12
4.分页功能
其实分页功能的实现依据是一个page值,通过在路径中添加page=number,来实现后端LIMIT参数的改变
注意:poscms有个很坑爹的地方就是这个limit,我们一般要实现从第10项开始,往后查5项,都会这么写:
limit(10,5),但是poscms却是这么写的:$this->db->limit(5,10),这个源程序的开发者怕是故意和大家作对
吧。
之前查询结果很多的话,就得分页了,那1、2、3页的路径怎么获取呢,首先我封装了一个一行的php函数
方便页面里面调用:
function dr_cururl(){ return $_SERVER[‘REQUEST_URI‘]; }
这个方法返回地址栏的全部地址(其实这块有个小bug,但是不影响使用,就是当页面处于第二页的时候,
地址栏会有查询条件参数+&page=2,此时第三页的地址应该是通过dr_cururl()函数获取的地址截去page参数
加上page=3,不截去的话就变成了条件参数+&page=2&page=3,这也是我刚刚想到的,明天去完善一下这个
函数)
在这里我用了一个同事以前提供的判断上一页下一页page值的脚本,之前的脚本a标签的地址是写死的,我后期
通过上面的函数完善了一下,这里贴上代码:
{if empty($get.page)} {php $page=1;} {else} {php $page=$get.page;} {/if} <!--上一页--> {if $page > 1} {php $pra = $page-1;} {else} {php $pra=1;} {/if} <!--下一页--> <!--$nums为最大页码--> {if $page==$nums} {php $next = $nums;} {else} {php $next = $page+1;} {/if} {if $nums==1} <div class="inner" style="text-align:center;margin-top:20px;"> <a>共{$nums}页</a> </div> {else} <div class="inner" style="text-align:center;margin-top:20px;"> <a>共{$nums}页</a> <a href="{dr_cururl()}&page=1">首页</a> <a href="{dr_cururl()}&page={$pra}">上一页</a> <a href="{dr_cururl()}&page={$next}">下一页</a> <a href="{dr_cururl()}&page={$nums}">尾页</a> </div> {/if}
注意:$nums是poscms系统开启分页(list标签中有page=1时开启分页)后返回的最大页数
至此,就完成了在列表页实现的查询、分页功能,注意,除了dr_cururl()这个函数是写在公共函数库文件里面,
其他所有上面列出的代码都是写在列表页的,所有的东西都是写在这个页面(list页面)的,不需要去动系统的
控制器,不需要去建search页面,所有的一切只需要在这个页面就可以完成!!!惊喜不惊喜?刺激不刺激?
好了,继续下一篇,来谈谈针对前端小姐姐抛出的问题,我是怎么解决的。
以上是关于C# List 分页查询怎么实现的主要内容,如果未能解决你的问题,请参考以下文章