对于大学4年的自问www.4688.com

博客已经搬迁到这里啦


2017/05/31日更新:

周末闲来无事,突然想写个分页的事物玩玩,说走就走

一年多未来,再度对友好的生活举行了五遍反思,本次的自问很痛心:看直播到底能赢得什么

原文:
写博客也一年多了,还一直不写过哪些总计地方的事物,前几天在V2EX下边发了一个有关C++应届毕业生的迷离的帖子,然后今日下午想了无数,所以突然想写写高校4年来的各种事态。

自高中起就对编程很感兴趣了,当时很“天真无邪”,想学编程就是为着写一手外挂来帮团结玩dnf,所以高考报专业的时候就趁机总结机来了。当然,由于高中沉迷散文和游玩,所以只考了个二本高校。

若果您觉得我会讲一个喜爱编程的学生在高等高校里苦学编程的励志故事,那么对不起,让您失望了。

 在篇章最后我会把全副项目+数据库附上,下载下来直接运行就可以看效果了。整个项目采纳的是粗略三层情势,开发平开是VS2010+SQL2012

大一

和多数同桌的想法相同,觉得大学的美好生活来了。由于高考停止的时候接触了lol,之后就一发不可收拾,每日和高等学校室友或者高中同学大战lol。由于天生不错,相比其他同学,我前进很快,所以在这边找到了一种满足感。值得一提的是,由于自家的天真无知,考试前完全没有复习,高等代数1挂科了,学院唯一挂科的学科啊!后来假期归来恶补了一礼拜,成功过了补考,大一就这荒废掉了。

一、我要做什么

大二

这一年比起大一来说,好了部分吧。我会在讲课的时候自学汇编(什么?你说怎么是执教时间,因为下课后还要lol啊),比起高中的时候看汇编,本次轻松多了,四次下来畅通无阻,而不是高中这会儿看汇编,完全看不下去。然后在大二下学期的时候先河看一本www.4688.com,《orange’s
一个操作系统的落实》
的书,这本书教我们从指点起首,一步步编制一个简易的OS。对于当下的自己的话仍然有些挑衅吧,没能一口气看完。

要说大二最关键的是什么,这应该就是碰着了一个好助教吗。他姓蒋,就称他为蒋先生啊。他上的课是自个儿大学里唯一一门认真听完,从没翘过课的课。蒋老师教的是数据结构的课,上课从不读ppt,也不坚守课本讲,只需要一根粉笔,就能从南扯到北,从东扯到西。我从他这接受了很多文化,从当时起先,我才领会了数据结构是哪些。这在此之前的自家直接觉得数据结构就是C语言里面的struct,我会想这样一个事物就能开一门课,好狠心的指南。然后就是这门课的大作业了,蒋先生给了大家广大题材,让大家团结一心选,我就选拔写一个简报工具。当时坚守孙鑫先生的录像,边学mfc边开发顺序。。

在暑假里,我完善了这多少个报道工具,实现了nat穿透的效益,使得多少个客户端可以直接通讯。还为此去看了tcp/ip详解。然后在威客网上接了人生中的第一个品种,是个电脑化学方向的大学生给的,他只会化学,不会总结机,然后又调剂到了总括机化学的大方向,所以他们老师要求她做的软件他做不来,就上威客发任务了。看自己是个学生,就把任务给了自家。内容挺简单的,就是领取数额,然后通过公式总结,画出折线图。

  很彰着,我想做到一个数目的真分页功用,咋做到吗,干脆就写一个列表页,取名为:学生列表页音讯。

大三到现行

说起大三,应该算是一个相比较大的转向吧。首先很要紧的某些,我在大三的六月份从0起先,在一区单排上了砖头,当时自我自己充裕区的号仍旧黄金,所以说绝不看不起黄金,他们唯恐只是没打排位而已。上了砖头之后,我对lol的执念也就没了,所将来来就不再没日没夜地玩了。在一遍偶然的火候,我接触了部分培训学校的C++教学视频,这突然就颠覆了我对C++的视角,就像C++
程序员自信心曲线图
地点的图景,在看录像前,我也是信心爆棚,以为C++就那么点样子,早就理解了。前边看视频后渐渐了解到C++原来还有如此多特点,大三上学期就照着视频入门了C++,并且粗略地看了一回《设计形式》

对自我来说,人生中最重点的一个时期,那纯属就是大三的不得了寒假,出于想在大三下学期找个实习,然后在网络浏览浏览的时候,莫名其妙就发现了腾讯啊,阿里的合作社都招实习生,于是乎我又看到了部分面经,发现了原本外人都是如此牛的。痛定思痛,决定好好学习。这多少个寒假本身就每日晚上起来看两集MIT的算法公开课,早上到夜幕看看书。一个寒假的时候,把算医学完了,看了一本《Effective
C++》
、一本《CSAPP》

自此就起首大三下学期了,从自我博客的上申时间就可以看出来,我是从15年的二月份起初写博客的,起头写博客的节骨眼很有趣,容我在底下给我们来说明。

在九月份我表弟找到自己,问我会不会活动端的编程,他说他有同学要创业(我称她同学为黄哥)需要人手,然后自己就萌萌哒地说不会,然后黄哥就说可以让我选拔iOS或Android来学,我说自己有C的基础就学OC吧,于是乎我就拉开了iOS学习之路。画风不对啊,说好的写博客的转折点呢?由于学iOS需要mac,所以黄哥就把她的mac借给我用。重点来了,当时虽然学着iOS,可是自己仍旧保有一颗C++的心,我备感需要做点什么。我决定开端做速记,因为自己今日有两台你电脑,一台看pdf,一台做速记,正正好啊!我从小学起来就没有做过笔记,我的率先次仍然要在那里捐了。于是乎我每一天白天里读书iOS,然后中午就做六个时辰笔记,然后想着,反正也做了笔记,就弄个博客传上去吧,我的博客就是如此诞生的。

这段时光是真正认真,除了教学就是看iOS录像,然后早上都固定两时辰的笔记时间,所以就十二月份和一月份两个月份,我就学习了《stl源码剖析》、《Effective
C++》(第二遍)、《设计模式》(第二遍)。顺便提一下要命iOS的序列,由于各个缘由,这一个项目不做了,所以算是我只是学了iOS的视频,而并未当真做过东西,所以现在几乎百分之百忘光了。期间自己在场过腾讯,阿里,360的实习生笔试,全体挂了,现在想想也挺正常的,一个混了3年的二本学生怎么和那一个好好学习的211,985们比。当然了,我个人觉得单论智商我应当依然有211的程度的,不过这只是小智慧罢了。真正有效的是聪明,那是内需靠积累的。

9月份,在此以前的不胜硕士又来找我了,让自己做毕设,问我会不会QT,我自然不会啊,我说自家得以学,他说给自己多少个月时间做完。我就答应了,然后花了一个月的时日做完了。可是那些项目给了自身一个很大很大的启迪,写程序简单,维护难。在这之后,他找了我不下10回,都是各类新的要求问题啊,bug啊之类的。而且我还要负责教会他那些程序,好让他去驳斥。

写到这,我恍然意识了博客的一个功利。它会记录下你的光阴线,当您想起的时候,就很容易想起当年干了哪些。

1月份本身的博客没有记录,仔细考虑应该是敷衍考试呢。毕竟一学期一度的考查周要到了,所以我就先河补在此以前没听的学科。考完试我就去招聘网上投了些实习岗位的简历,找了一家很坑的集团去实习。

十一月份到五月份在这家很坑的小卖部见习了1个多月,重要做的干活是,基于duilib库,开发界面。前边感觉这不是自己想做的做事,就跳到此外一家玩耍公司。我应聘的是C++岗位,进去后安排我做lua,然后又是画界面,画界面,画界面!不过给的月工资很高,所以自己就没舍得走。一向干到十二月底,迫于学校还有6门课,不能够完全不去上课,所以就辞职了。在两份实习工作的中间,我自学了《深度探索C++对象模型》《UNIX环境高级编程》《编码》。对了在此地推荐一个书单,我在这地方找了广大要看的书。在实习期间我也投递了一一大厂的校招,最终仍是颗粒无收,唯一有戏的就是搜狗了,面了两面,面试官都是当场说我透过的,最终headcount4个,我只排第10,真的感觉好心痛。

回头看看,发现自家15年九月到五月过得确实挺充实的。但是里面依旧有一部分“垃圾”时间的,我或者会和高中同学或学院校友开开黑,虐虐旁人(以前说了,我在和谐那一个区惟有金子的段位,前边打了10来啊,打到白金了,所以打匹配如故赢多输少的)。当然也会关注lol的赛事,我是一个WE粉丝,从S2伊始就对这支军队情有独钟,即使他明天衰退了,可是不影响我对她的保护,所以假诺WE有比赛,我是每场必看的。后边我给垃圾这几个词加上了引号,那是因为我觉着这个时间实在也是贵重的,未来可能很少有机会和同班开黑了呢。

此后的四月份到1九月份,我在MIT的公开课中起首攻读线性代数(在此之前数学学得直白很烂,所以想再学五遍),只学了19集,还有就是边学边翻译《Effective
Modern
C++》
,无耻地引进一下自己的翻译专栏。最后就是背单词了,此前靠着周末的一点时辰,自己写了个背单词的软件,需要协调输入粤语和英文意思,这么设计的因由也是想让祥和记念得深厚一些。背单词是从7月份起头的,一贯背到了二月份。每一天20个,总结有2000几个单词吧。

接下去放假了,就进来了疲软期,也就是说没有事先学习地认真了。我几乎每日都睡到很迟,看书什么的也日常分心,看着看着就去浏览网页,或者刷乐乎了。说道今日头条我要说一点,果壳网真的很浪费时间,因为自身对今日头条的浏览总是在做深度优先搜索,看了一个答案,觉得不错之后,我就会点开这厮的首页,去看她的回答,然后又发现新的人,新的答案,有时候这么一看就是一天。还有就是基本上每一天都在lol一向玩到了8月份。回家过年这多少个天也统统没有上学,每一日看看动漫,过生活。

然后2月20号左右回母校了,先导找实习,面了重重过多家,不明了怎么都被拒了,每回面试的感觉都挺好的,然并卵。到先天(六月12日)截止,收到六个offer。那一个周一发生了一件很关键的工作,我在乐乎的短信息中吸纳了一条私信,是有人说她一贯在关切本身的《Effective
Modern
C++》的翻译,这给了自我很大的协理。因为这么自己能感受到我翻译的东西依旧管用的,依然有人会从中获益的。我卓殊感谢这位博友(从博客上认识的就叫博友把)对自家的肯定。

  列表页当数据量很大的时候,即便拔取的假分页,将造成短期的等候,同时极大的占有服务器资源等等。由此可见,诸多不便,相当不科学。所以这里自己想写一个简单的效率较完善的列表页,它襄助字段搜索,用户自定义排序(采纳排序字段、拔取升序或降序)以及自定义每页呈现行数,当然它如故无刷新的。整个页面的布局如下:

总结

自己今日每一日都感到日子过得急忙,恨不得每一天能再多多少个钟头给自身用。然则尽管本人前几天天天觉得时间过得快,我现在的年月流逝速度比起大一和大二是真的慢了许多广大了。何以见得,因为自身前天追思起大三那些寒假,我会觉得是很久从前才暴发的工作了,再回顾一下,这一年的确也学了无数居多事物,这和事先的感觉到是一心两样的。在此以前大一和大二过完的时候,我的感到都是,什么?一年就这么没了?也太快了啊。所以说,果壳网下面回答说的好,让投机走出“舒适区”,尽量让投机待在“学习区”。我个人的一个通病就是,我很容易待在“舒适区”和“恐慌区”,我有时候考虑一个算法能考虑一整天,然则仍然不曾想出解决办法,这就属于浪费时间了。所以尽可能让祥和待在“舒适区”吧!

——————-2016/03/13补充

  www.4688.com 1

你还在兜圈吗?

在写完大学四年的统计之后,结合大家的部分评价,我在上床的时候想了很多,也收获了些东西,就把它分享给大家吧:

唯恐在我们每个人的人生路途中,一起始都是在兜圈,每一遍过完一年后只是独自地回来了起源。只有在了解到那点后,才晓得要找到一条离开的路,然后不管是垂直地仍旧弯弯曲曲地向着对象提升,那样的人生才是有含义的。也许每个人最大的两样就是精通的必然,可能有些人一起头就悟到了,比你早出发了几年,十几年。也可能部分人至死都在连轴转,漫无目标地活着。

自我曾经启程了,即使前途漫漫,可是真正在实干地前进。那么您啊?

下边还有部分自家的揣度,因为我从不经历过:

再有的人会在触碰着“目的”之后就失去了方向,又初阶兜圈了。但是请想一想,兜圈的人生是连连循环不断重复的,这样的人生真的好吧?二〇一九年走这么的路,2018年也走,年年走,难道不会腻么?倘使你实在触碰到了“目的”
那么可以试着去追求更远的靶子,或者换一条路,
换个样子往前走,试着找找新目标吗。

自我希望自己事后每年都能回到看望这篇博文,指示自己毫无停下来兜圈。

ps:感觉有点爆炸,我是程序员啊,而不是翻译家,怎么就想到这多少个乱七八糟的东西了啊?还有,这补充怎么感觉富含鸡汤的意味啊。不过我愿意每个看到那篇博文的人都能完美想转手,你现在是在兜圈呢,仍然真正在腾飞呢?希望我们都能快点逃离那么些“美观”的框框吧。

二、我要咋办

  自我的所有蓝图已经构建出来了,接下去就是如何是好了。按照我的需求,首先页面要求是无刷新的,所以这里大家必然要使用到的技巧是ajax,说到ajax,肯定离不开json,它用来与服务器打交道来回传输数据。

  第二点就是真分页,关于真分页,总所周知就是利用sql的row_number来给多少加索引,然后按照条件去取。可是数据量百万级此外时候,row_number也不翼而飞得功效,因为它首先要把您的百万数量总体row_number五回加上索引,功用可想而知,这里我动用的是另一种方法:in 与 not
in。这里自己把自己用的真分页存储过程贴出来(注:这一个蕴藏过程并不是本人写,这是本人在网上找到的(某位高人写的),具体链接也不记得了,由此可见在此间感谢作者),稍后再来看那些蕴藏过程的参数。

www.4688.com 2www.4688.com 3

ALTER PROC [dbo].[Proc_EWorkFlow_DataPaging]
@tbname     sysname,               --要分页显示的表名
@FieldKey   sysname,               --用于定位记录的主键(惟一键)字段,只能是单个字段
@PageCurrent int=1,                 --要显示的页码
@PageSize   int=10,                --每页的大小(记录数)
@FieldShow  nvarchar(1000)='',      --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder  nvarchar(1000)='',     --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
                                        --  用于指定排序顺序
@Where     nvarchar(1000)='',      --查询条件
@PageCount  int OUTPUT            --总页数
AS

DECLARE @sql nvarchar(4000)
SET NOCOUNT ON
--检查对象是否有效
IF OBJECT_ID(@tbname) IS NULL
BEGIN
    RAISERROR(N'对象"%s"不存在',1,16,@tbname)
    RETURN
END
IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
BEGIN
    RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
    RETURN
END

--分页字段检查
IF ISNULL(@FieldKey,N'')=''
BEGIN
    RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
    RETURN
END

--其他参数检查及规范
IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
IF ISNULL(@PageSize,0)<1 SET @PageSize=10
IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
IF ISNULL(@FieldOrder,N'')=N''
    SET @FieldOrder=N''
ELSE
    SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
IF ISNULL(@Where,N'')=N''
    SET @Where=N''
ELSE
    SET @Where=N'WHERE ('+@Where+N')'

--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
IF @PageCount IS NULL
BEGIN
    SET @sql=N'SELECT @PageCount=COUNT(*)'
        +N' FROM '+@tbname
        +N' '+@Where
    EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
    SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
END

--计算分页显示的TOPN值
DECLARE @TopN varchar(20),@TopN1 varchar(20)
SELECT @TopN=@PageSize,
    @TopN1=@PageCurrent*@PageSize    

--第一页直接显示
IF @PageCurrent=1
    EXEC(N'SELECT TOP '+@TopN
        +N' '+@FieldShow
        +N' FROM '+@tbname
        +N' '+@Where
        +N' '+@FieldOrder)
ELSE
BEGIN
    SELECT @PageCurrent=@TopN1,
        @sql=N'SELECT @n=@n-1,@s=CASE WHEN @n<'+@TopN
            +N' THEN @s+N'',''+QUOTENAME(RTRIM(CAST('+@FieldKey
            +N' as varchar(8000))),N'''''''') ELSE N'''' END FROM '+@tbname
            +N' '+@Where
            +N' '+@FieldOrder
    SET ROWCOUNT @PageCurrent
    EXEC sp_executesql @sql,
        N'@n int,@s nvarchar(4000) OUTPUT',
        @PageCurrent,@sql OUTPUT
    SET ROWCOUNT 0
    IF @sql=N''
        EXEC(N'SELECT TOP 0'
            +N' '+@FieldShow
            +N' FROM '+@tbname)
    ELSE
    BEGIN
        SET @sql=STUFF(@sql,1,1,N'')        
        --执行查询
        EXEC(N'SELECT TOP '+@TopN
            +N' '+@FieldShow
            +N' FROM '+@tbname
            +N' WHERE '+@FieldKey
            +N' IN('+@sql
            +N') '+@FieldOrder)
    END
END

View Code

  有了这些蕴藏过程,基本上就很容实现我们要做的事了,现在来看下存储过程的参数

  @tbname     sysname,                –要分页显示的表名或视图
  @菲尔德(Field)Key   sysname,                
–用于固定记录的主键(惟一键)字段,只好是单个字段
  @PageCurrent int=1,                  –要体现的页码
  @PageSize   int=10,                  –每页的尺寸(记录数)
  @菲尔德(Field)(Field)Show  nvarchar(1000)=”,     
–以逗号分隔的要呈现的字段列表,如若不指定,则显得所有字段
  @FieldOrder  nvarchar(1000)=”,    
–以逗号分隔的排序字段列表,可以指定在字段前面指定DESC/ASC
  @Where     nvarchar(1000)=”,      –查询条件

  

  依照后边的注脚,应该都能看懂,遵照本人的急需,有多少个重大条件是本身要用到的:@PageSize、@菲尔德(Field)Order、@Where、@PagCurrent,遵照后边的诠释我们领悟它们各自是:每页的轻重缓急、排序条件、查询条件(及搜索条件)以及要来得的页码,这六个标准化都是自己的需要里用户可以独立定义的,就是说传进去的原则是遵照用户的选项而定的。其他的尺度我们都给死的(@tabname后台写表名即可,@FieldKey、@菲尔德(Field)Show也同理),说到这里应该更清晰了。

  现在回过头来理一理我要如何是好:

  1.拿到用户挑选的准绳(搜索条件、排序条件、页面大小、呈现第几页);

  2.操纵并行使ajax、json相关技术来构建桥梁把用户挑选的原则传入后台拉取数据

  3.取得服务器回传的数码,显示在页面上。

  

  下边三点说的很简单,下边就开端出手做吧!

 

三、我要出手做

  近年来就起来正儿八经做了,整个页面的布局在地点已经显示给我们看了,为了方便精通,在此处自己把自身一度形成了的列表页展现出来:

  www.4688.com 4

从列表页看,除了搜索条件是用户输入外,其他的排序、上一页、下一页等等都是让用户点一下就执行,说白了就是页面上具备可点击的按钮以及下拉框拔取改变都是调用同一个主意,我取名为GetData();通过这多少个措施大家要到位上有些自家说的三点:

  1.取得用户挑选的尺度(搜索条件、排序条件、页面大小、彰显第几页);

  2.控制并运用ajax、json相关技术来构建桥梁把用户采用的口径传入后台拉取数据

  3.拿走服务器回传的多少,展现在页面上。

下边我把GetData()方法的伪代码写出来

function GetData(){

  //获取搜索条件
  var searchFilter=GetSearchFilter();
  //获取排序条件
  var orderFilter=GetOrderFilter();
   //获取页面显示行数
  var pageSize=cbxPagSize.value();
  //获取要显示的页码
   var pageIndex=GetPageIndex();

  //通过Jquery 和json把获取到的条件传入后台
  $("...",jsonstring,function(result)){
    //将获取到的数据加载到页面上
    DrawListPageData(result);
  }
}

按照地点的伪代码,大家来分步完成要水到渠成的代码,就不多说了,直接把代码贴出来,重要的是思路顺畅

GetSearchFilter():

www.4688.com 5www.4688.com 6

    <script type="text/javascript">
        function GetSearchFilter() {
            var studentNo = trim($("#txtStudentNo").val());
            var name = trim($("#txtStudentName").val());
            var sex = trim($("#cbxSex").val());
            var age = trim($("#txtAge").val());

            var searchFilter = "";
            if (studentNo != "") {
                searchFilter += " and studentNo like'%" + studentNo + "%'";
            }
            if (name != "") {
                searchFilter += " and name like'%" + name + "%' ";
            }
            if (sex != "") {
                searchFilter += " and sex ='" + sex + "' ";
            } if (age != "") {
                searchFilter += " and age ='" + age + "' ";
            }
            return searchFilter;
        }
    </script>

View Code

GetOrderFilter():

www.4688.com 7www.4688.com 8

<script type="text/javascript">
        function GetOrderFilter() {
            var orderFilter = "";
            var selectedfield = GetSeletedSpanName("tdSortComlum");
            var orderWay = GetSeletedSpanName("tdDescOrAsc");
            if (selectedfield != "") {
                orderFilter += selectedfield +" " ;
            } else {
                orderFilter += "  studentNo ";
            }

            if (orderWay != "") {
                orderFilter += orderWay;
            } else {
                orderFilter += " desc";
            }
            return orderFilter;
        }

        //tdSortComlum 存放排序列的容器
        //tdDescOrAsc 存放升序或降序的容器
        function GetSeletedSpanName(containerName) {
            var Column = document.getElementById(containerName);
            var columns = Column.getElementsByTagName("span");
            for (i = 0; i < columns.length; i++) {
                if (columns[i].className == "spanOnClick") {
                    return columns[i].id.substr(2);
                }
            }
            return "";
        }
    </script>

View Code

GetPageIndex():

www.4688.com 9www.4688.com 10

<script type="text/javascript">
        function GetPageIndex(pageIndex) {
            var currentPage = $("#hfCurrentPage").val();
            var totalPages = $("#hfTotalPages").val();
            //返回0 表示无效的点击
            if (pageIndex == null) {
                return 1;
            } else {
                //点击上一页
                if (pageIndex == "-1") {
                    if (parseInt(currentPage) + parseInt(pageIndex) <= 0) {
                        return 0;
                    } else {
                        return parseInt(currentPage) + parseInt(pageIndex);
                    }
                } 
                //点击首页
                else if (pageIndex == "0"){
                    if (currentPage == "1") {
                        return 0;
                    } else {
                        return 1;
                    }
                }
                //点击下一页
                else if (pageIndex == "1") {
                    if (currentPage == totalPages) {
                        return 0;
                    } else {
                        return parseInt(currentPage) + 1;
                    }
                }
                //点击尾页
                else if (pageIndex == "9") {
                    if (currentPage == totalPages) {
                        return 0;
                    } else {
                        return totalPages;
                    }
                }
                //点击跳转到
                else if (pageIndex == "5") {
                    var jumpIndex = trim($("#txtPageCount").val());
                    if (isNaN(parseInt(jumpIndex)) || parseInt(jumpIndex)!=jumpIndex) {
                        return 0;
                    } else if (parseInt(jumpIndex) > parseInt(totalPages) || parseInt(jumpIndex) < 1 || jumpIndex == currentPage) {
                        return 0
                    } else {
                            return jumpIndex;
                    }
                }
                return 0;
            }
        }
    </script>

View Code

DrawListPageData():

www.4688.com 11www.4688.com 12

<script type="text/javascrpt">
        function DrawListPageData(data) {
            var items = "";
            //数据展示顶部也画出总记录数
            $.each(data[1], function (i, resultData) {
                items += "<table  width=\"100%\"><tr ><td style=\"width:30%\"></td>";
                items += " Total Records:" + resultData[0].totalRecords + "&nbsp;&nbsp;&nbsp;&nbsp;  ";
                items += resultData[0].currentPage + "/" + resultData[0].pageCounts;
                items += "(Current Page/Total Pages)";
                items += "</tr></table>";
                $("#hfCurrentPage").attr("value", resultData[0].currentPage);
                $("#hfTotalPages").attr("value", resultData[0].pageCounts);
            });
            //画出数据
            $.each(data[0], function (i, getData) {
                items += "<table width=\"100%\" border=\"1\" cellpadding=\"3\" cellspacing=\"1\" bgcolor=\"#B4B4B4\" style=\"border-collapse: collapse;background-color:#FFFFFF\">";
                items += "<thead style=\"background-color:#F1FAFF;\"><tr><td>Student No</td><td>Student Name</td><td>Sex</td><td>Age</td></tr></thead>"
                $.each(getData, function (i, resultData) {
                    items += "<tr><td style=\" width :25%\">" + resultData.studentNo + "</td>";
                    items += "<td style=\" width :25%\">" + resultData.name + "</td>";
                    items += "<td style=\" width :25%\">" + resultData.sex + "</td>";
                    items += "<td style=\" width :25%\">" + resultData.age + "</td></tr>";
                });
            });
            items += "<table>"

            //画出数据总记录数,以及分页按钮
            $.each(data[1], function (i, resultData) {
                items += "<table  width=\"100%\"><tr ><td style=\"width:30%\"></td>";
                items += " Total Records:" + resultData[0].totalRecords + "&nbsp;&nbsp;&nbsp;&nbsp;   ";
                items += resultData[0].currentPage + "/" + resultData[0].pageCounts;
                items += "(Current Page/Total Pages)";
                items += "<td style=\"width:40%\">FirstPage";
                items += "PrePage";
                items += "NextPage";
                items += "LastPage</td>";
                items += "<td style=\"width:30%\">Jump To:<input id=\"txtPageCount\" type=\"text\" style=\"width:40px;\" />";
                items += " <input id=\"btnConfirmJump\" type=\"button\" value=\"OK\" onclick=\"GetData(5)\" style=\"width:40px; height:21px\" /></td></tr></table>";
            });
            $("#divDataDisplay").html(items);
        }
</script>

View Code

全方位GataData()的代码为:

<script type="text/javascript">
        //获取数据集
        function GetData(index) {
            var pageIndex = GetPageIndex(index);
            //alert(pageIndex);
            if (pageIndex == "0") {
                return false
            }
            $.post("../Ajax/StudentInfoHandler.ashx", { "actionCode": "0", "orderFilter": GetOrderFilter(), "searchFilter": GetSearchFilter(), "pageSize": $("#cbxPageSize").val(), "pageIndex": pageIndex }, function (result) {
               // alert(result);
                var ss = result.substr(11);
                if (ss != "0") {
                    var resultData = JSON.parse(ss);
                    DrawListPageData(resultData);
                } else {
                    $("#divDataDisplay").html("No data to display...");
                }
            });
        }
</script>

这边有两点要表明下:
  1.在伪代码里面GetData()是尚未参数的,为何完整代码里面GetData(index)有个参数?

    试想一下,点击排序和点击上一页、下一页的区别.

    点击排序:页面不跳转,比如当前是第四页,我事先选的升序,现在我选降序,那么数量呈现会变,不过如故展现第四页的数量,即页码不变

    点击上一页:页码是会跳转的,当前页码-1(固然可以).

    点击下一页:页码是会跳转的,当前页码+1(假使得以).

    点击首页:页码是会跳转的,页码重置为1.

    点击尾页:页码是会跳转的,页码重置为最大页码数.

  

    从地点意况分析可知,不同的按钮点击对页码的操作也不比,所以大家需要一个标记来告诉
GetPageIndex(index)形式要怎么对页码进行操作,仔细回头去看下GetPageIndex方法就通晓了。

  2.DrawListPageData(data)方法,data参数是后台json系列化了的字符串,准确的身为数组字符串,一个数组存放数据新闻(总共多少数量、总共多少页、当前页码),一个存放数据量音信。所以分开遍历画在页面上。

 

  好了,前台该做的操作都做完了,我们前几日跳到后台去探望。先说下原理了,后台查出来的数额时Dataset集合,这么些dataset里面存放了六个DataTale,一个是存放的数据集,另一个存放的数据量消息。然后经过大家团结一心写的一个方法DataSetToJson循环遍历dataset再次回到json字符串.下面是DataSetToJson方法:

www.4688.com 13www.4688.com 14

/// <summary>
        /// Dataset转换为json字符串,返回的是json数组
        /// </summary>
        /// <param name="ds"></param>
        /// <returns></returns>
        public string DataSetToJson(DataSet ds)
        {
            try
            {
                System.Text.StringBuilder str = new System.Text.StringBuilder("[");
                for (int o = 0; o < ds.Tables.Count; o++)
                {
                    str.Append("{");
                    str.Append(string.Format("\"{0}\":[", ds.Tables[o].TableName));
                    for (int i = 0; i < ds.Tables[o].Rows.Count; i++)
                    {
                        str.Append("{");
                        for (int j = 0; j < ds.Tables[o].Columns.Count; j++)
                        {
                            str.Append(string.Format("\"{0}\":\"{1}\",", ds.Tables[o].Columns[j].ColumnName, ds.Tables[o].Rows[i][j].ToString()));
                        }
                        str.Remove(str.Length - 1, 1); str.Append("},");
                    }
                    str.Remove(str.Length - 1, 1); str.Append("]},");
                }
                str.Remove(str.Length - 1, 1);
                str.Append("]"); return str.ToString();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

View Code

一体后台操作的代码:

public void GetData(HttpContext context)
        {
            try
            {
                string whereFilter = context.Request["searchFilter"];
                string orderFilter = context.Request["orderFilter"];
                string pageSize = context.Request["pageSize"];
                string currentPage = context.Request["pageIndex"];
                StudentServices service = new StudentServices();
                DataSet ds = new DataSet();
                DataTable pageTable = new DataTable("pageTable");
                pageTable.Columns.Add("totalRecords");
                pageTable.Columns.Add("pageCounts");
                pageTable.Columns.Add("currentPage");
                pageTable.AcceptChanges();
                //获取数据集
                DataTable dataTable = service.GetStudentDS(" 1=1 "+whereFilter, orderFilter, pageSize, currentPage).Tables[0];
                dataTable.TableName = "dataTable";
                if (dataTable.Rows.Count > 0)
                {
                    ds.Tables.Add(dataTable.Copy());
                    //Get total records
                    int totalRecords = service.GetStudentCounts(whereFilter);
                    //Get page counts
                    int pageCounts = totalRecords % int.Parse(pageSize) ==0 ? totalRecords / int.Parse(pageSize): totalRecords / int.Parse(pageSize)+1;

                    DataRow dr = pageTable.NewRow();
                    dr["totalRecords"] = totalRecords;
                    dr["pageCounts"] = pageCounts;
                    dr["currentPage"] = currentPage;
                    pageTable.Rows.Add(dr);
                    ds.Tables.Add(pageTable);
                    JsonHelper js = new JsonHelper();
                    context.Response.Write(js.DataSetToJson(ds));
                    return;
                }
                else
                {
                    context.Response.Write("0");
                    return;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

 

  到这里大家的做事就完了了,很多细节都不曾拿出的话,比如css+div的十分等等。这里最主如若介绍思路以及落实情势,在作品最终我会把整个项目+数据库附上,下载下来直接运行就可以看效果了。整个项目采纳的是简单三层情势,开发平开是VS2010+SQL2012

  

  四、总结

  整整周末都在弄这玩意儿,极烂的频率就不多说了(两天成功一个页面),首虽然友好对ajax的不懂行运用,即便花了两天,但是觉得温馨提高很大,先总结一下用到的技术以及相应小心的题目

  1.应用到的技艺:ajax、json、javascript、存储过程、css+div(这么些即便没拿出以来,但自己整了很长事件lol)

  2.应有专注的问题:

    写这一个事物的时候虎头虎脑,想到一点写一些,没有很好的构架自己要怎么,写这篇作品实际是一体东西写完后回过头来再写的,假使起首写这个东西的时候能有写著作的时候的笔触完成应该快捷,不问可知摸爬滚打出经验,未来切记自己写东西前要精晓自己要干什么以及怎么干.

 

 

源码下载:

链接: http://pan.baidu.com/s/1jGoN3bK 密码: 4b6t

  

  

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website