2015年1月5日星期一

【干货】再上数据分页控件 ━ 更加灵活,更加实用

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
【干货】再上数据分页控件 ━ 更加灵活,更加实用  阅读原文»

【干货】再上数据分页控件 ━ 更加灵活,更加实用

再上数据分页控件-更加灵活,更加实用

  关于数据分页的文章太多了,各有各的一套方案,但大多都很类似,要么使用存储过程,要么直接使用代码进行分页。各种方案分页的效率也不尽相同,我们不一定要找一个最高效的(根据实际的项目情况),找一个最合适的就OK了。下面我要谈的分页控件非常灵活,可以支持任意类型的数据库,同时可以支持存储过程或代码分页(会自动判断),也支持多表的分页,非常的方便。对于数据分页的相关文章,在我的博客中可以找到很多,下面我做一个简单的汇总,方便大家查阅。

1、原创企业级控件库之大数据量分页控件

2、再上数据分页控件(不用存储过程)

3、RDIFramework.NET中多表关联查询分页实例

  下面要给大家分享的分页控件只做分页的处理,不做与数据库相关的操作。直接提供分页的数据给分页控件即可。它不关心你的数据来源是什么,也不关心你采用的数据分页的方式(存储过程或代码等)。这个分页控件我取名为:UcPagerEx,如下图所示:

  实现分页控件的代码非常的简单,下面直接给出全部源码,大家可以参考下,整个分页控件的源码如下:

  using System;  using System.ComponentModel;  using System.Windows.Forms;  namespace RDIFramework.Controls  {      public delegate void PageChangedEventHandler(object sender, EventArgs e);      /// <summary>      /// 分页用户控件,仅提供分页信息显示及改变页码操作      /// </summary>  public partial class UcPagerEx : UserControl  {          public event PageChangedEventHandler PageChanged;          private int _pageSize;          private int m_PageCount;          private int _recordCount;          private int _pageIndex;          public UcPagerEx()          {              InitializeComponent();              this._pageSize = 10;              this._recordCount = 0;              this._pageIndex = 1; //默认为第一页          }          /// <summary>          /// 带参数的构造函数          /// <param name="pageSize">每页记录数</param>          /// <param name="recordCount">总记录数</param>          /// </summary>          public UcPagerEx(int recordCount, int pageSize)          {              InitializeComponent();              this._pageSize = pageSize;              this._recordCount = recordCount;              this._pageIndex = 1; //默认为第一页              this.InitPageInfo();          }          protected virtual void OnPageChanged(EventArgs e)          {              if (PageChanged != null)              {                  InitPageInfo();                  PageChanged(this, e);              }          }          [Description("设置或获取一页中显示的记录数目"), DefaultValue(20), Category("分页")]          public int PageSize          {              set              {                  this._pageSize = value;              }              get              {                  return this._pageSize;              }          }          [Description("获取记录总页数"), DefaultValue(0), Category("分页")]          public int PageCount          {              get              {                  return this.m_PageCount;              }          }          [Description("设置或获取记录总数"), Category("分页")]          public int RecordCount          {              set              {                  this._recordCount = value;              }              get              {                  return this._recordCount;              }          }          [Description("当前的页面索引, 开始为1"), DefaultValue(0), Category("分页")]                    public int PageIndex          {              set              {                  this._pageIndex = value;              }              get              {                  return this._pageIndex;              }          }          /// <summary>          /// 初始化分页信息          /// <param name="pageSize">每页记录数</param>          /// <param name="recordCount">总记录数</param>          /// </summary>          public void InitPageInfo(int recordCount, int pageSize)          {              this._recordCount = recordCount;              this._pageSize = pageSize;              this.InitPageInfo();          }          /// <summary>          /// 初始化分页信息          /// <param name="recordCount">总记录数</param>          /// </summary>          public void InitPageInfo(int recordCount)          {              this._recordCount = recordCount;              this.InitPageInfo();          }          /// <summary>          /// 初始化分页信息          /// </summary>          public void InitPageInfo()          {              if (this._pageSize < 1)                  this._pageSize = 10; //如果每页记录数不正确,即更改为10              if (this._recordCount < 0)                  this._recordCount = 0; //如果记录总数不正确,即更改为0              //取得总页数              if (this._recordCount % this._pageSize == 0)              {                  this.m_PageCount = this._recordCount / this._pageSize;              }              else              {                  this.m_PageCount = this._recordCount / this._pageSize + 1;              }              //设置当前页              if (this._pageIndex > this.m_PageCount)              {                  this._pageIndex = this.m_PageCount;              }              if (this._pageIndex < 1)              {                  this._pageIndex = 1;              }              //设置上一页按钮的可用性              bool enable = (this.PageIndex > 1);              this.btnPrevious.Enabled = enable;              //设置首页按钮的可用性              enable = (this.PageIndex > 1);              this.btnFirst.Enabled = enable;              //设置下一页按钮的可用性              enable = (this.PageIndex < this.PageCount);              this.btnNext.Enabled = enable;              //设置末页按钮的可用性              enable = (this.PageIndex < this.PageCount);              this.btnLast.Enabled = enable;              this.txtPageIndex.Text = this._pageIndex.ToString();              this.lblPageInfo.Text = string.Format("共 {0} 条记录,每页 {1} 条,共 {2} 页", this._recordCount, this._pageSize, this.m_PageCount);          }          public void RefreshData(int page)          {              this._pageIndex = page;              EventArgs e = new EventArgs();              OnPageChanged(e);          }          private void btnFirst_Click(object sender, System.EventArgs e)          {              this.RefreshData(1);          }          private void btnPrevious_Click(object sender, System.EventArgs e)          {              if (this._pageIndex > 1)              {                  this.RefreshData(this._pageIndex - 1);              }              else              {                  this.RefreshData(1);              }          }          private void btnNext_Click(object sender, System.EventArgs e)          {              if (this._pageIndex < this.m_PageCount)              {                  this.RefreshData(this._pageIndex + 1);              }              else if (this.m_PageCount < 1)              {                  this.RefreshData(1);              }              else              {                  this.RefreshData(this.m_PageCount);              }          }          private void btnLast_Click(object sender, System.EventArgs e)          {              this.RefreshData(this.m_PageCount > 0 ? this.m_PageCount : 1);          }          private void txtPageIndex_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)          {              if (e.KeyCode == Keys.Enter)              {                  int num;                  try                  {                      num = Convert.ToInt16(this.txtPageIndex.Text);                  }                  catch                  {                      num = 1;                  }                  if (num > this.m_PageCount)                      num = this.m_PageCount;                  if (num < 1)                      num = 1;                  this.RefreshData(num);              }          }      }  }  

代码基本没有什么难度,相信大家都能看得懂,那么如何使用这个控件呢?

  首先在生成的工具箱中拖动这个分页控件到界面上,再后再做数据绑定的代码即可。我直接展示一个已经做成的界面,如下图所示:

上面就是分页的效果,如何实现的呢?下面给出实现代码。

  我们可以在Load事件中调用下面的Search()方法对数据进行绑定,如下代码所示:

  private void Search()  {      var recordCount = 0;      this.DTProductInfo = GetData(out recordCount, ucPager.PageIndex, ucPager.PageSize, this.searchValue);      ucPager.RecordCount = recordCount;      ucPager.InitPageInfo();      // 加载绑定数据      this.GetList();  }  private DataTable GetData(out int recordCount, int pageIndex, int pageSize,string search)  {      re
追随你心 —— 聊聊VMCloud  阅读原文»

wps797.tmp

又是一年年末,春节未至,却是新年气氛浓郁,也该是时候来聊聊VMCloud了,顺便做下年度总结(主要是满足博主作为一个话痨想说话的心愿)。

图片2

当初做VMCloud,仅仅是作为一个博客来记录我IT成长之路,到了现在,VMCloud我觉得不能仅仅用"博客"这个称号来概括的一个词了(当然也确实仅仅是一个博客)。

在今年(2014),VMCloud 总体来说,实现了几个新的突破:

1、 博客从月PV几百,到12月份首次出现6G带宽全部耗尽的情况

2、 QQ群从最初的二十几个人,发展到现在一百四个人(中途清理了四十个人左右),其中活跃有七十多个人

3、 10月份成功举行在线讲坛四场,12月份成功在51CTO学院上线讲坛录制版

4、 从2013年的二十几篇博文,到现在接近百篇博文,从一开始只涉及System Center的几个主要组件,到目前System Center全套覆盖

对于我个人来说,有几件事是比较值得高兴的:

1、 VMCloud已经有了个大概的轮廓,分成两条线,一条线是目前还在更新的"VMCloud云平台",主打项目;另一条线是已更新一部分的VMCloud大讲坛,主打教育;

2、 主打项目的这条主线最需要的是认可,微软给予我MVP的称号就是最大的认可,而当一届MVP容易,坚持并连任才是困难的,而我连任了;主打教育的这条主线,可以说是觉得IT需要注入一些有深度、新鲜的力量进去才衍生出来的,有实无名,则无法揭竿而起,成功当选微软MCT就是那个名,MCT让我可以借其名义,发布讲坛,让业内更多的朋友能够看到IT产品或产业,给生产、生活带来的改变,从而能带动更多力量来一起改变。

3、 MVP、MCT带来不仅仅是更多学习的途径,也带来了更多能够与业内大牛交流的机会,杨杨老师、方建国方老师、张鹏亮胖老师、李询李老师、贾浩贾老师、胡浩胡老师、李江李老师、向承刚大象老师、高金良高老师、冯亮冯老师等等,都不同程度上在技术或生活态度上激励了我。

高兴之余,我还是要分享几句话,也是今年看到的几句有所触动的话:

1、 追随我心。(By 李开复);追随你的心。(By 乔布斯)

"追随我心"实际上是在2009年底的时候看李博士《世界因你不同》时看到的,而"追随你的心"这句话出自乔布斯的一本书(?也不知道是不是)。这些年来我一直在理解这句话,到目前为止,我想可以交出我的答案了,其实凡是只要你想做的,且能够做的(不违反人道主义的情况下),你为何不去做?既然要做,为何第一不能是你?带着这些疑问,我坚持完成2014年的Task List,VMCloud最终显现两条线,当然我也不想做第一,只想做自已想做的事情。

2、 坚持比努力更可怕。(已经找不到出处)

你想做的就应该去做,不说做第一要多努力,首先你要做成,做成需要的是一年三百六十五天的坚持,而不是一个星期三两天的努力。扯点动漫上的梗,火影的洛克李看过的人都应该很熟悉,并不是每个人都能成为鸣人或者佐助(就算可以,你也得承受得住他们承受的压力与痛苦),所以至少你应该成为洛克李。

3、 你站在一个不高,却足以让你跌死的位置。(已经找不到出处)

你是否总觉得你得到一点成就就洋洋得意?而不是整天自鸣得意;是否总觉得自已完成的事情已经足够?而不是觉得完成了某件事情其实只是冰山一角;如果你有以上想法,那很危险了,无论什么时候,都不要失去危机感。这并不关你的安全感怎样,这是因为我们永远站在一个不高,却足以让你跌死的位置。

4、 我不同意你的观点,但是我誓死捍卫你说话的权利。(By 伏尔泰)

高度够了,就应该锁住自已的脾气,我同意"存在即有理",任何的观点,即时你提出不同意见,但是至少你也应该基于对对方的尊重认真聆听对方的说话,同样的,任何你觉得他不会听你的话的人,你更应该认真的把你的观点表述出来,在互联网时代,其实根本不需要什么匿名,任何人的意见其实都具有参考意义,不是正面意义,至少也是反面的。所以,即使你在讨论到好像快要吵架或者已经吵架的时候,请至少保留一点理智,尊重并捍卫对方说话的空间及权利。更何况,还没有人能到达自已的高度呢。

5、 如果你总是觉得这样不行,觉得那样不行,那就已经慢了。(找不到出处,应该是原创?)

IT行业,信息化时代,任何东西都讲究快,所以很多时候,一项新技术在刚刚出现,其实就已经淘汰。这个时候,如果你还在犹豫,担心计划不够完美,不能够持之以恒,不能这,不能那的话,实际上你已经慢了,那究竟什么时候不慢?博主认为,只要你马上行动,从你行动那一刻,世界就因你不同,只要你坚持并追随你的心就永远都来得及。

6、 参与未来,是有能力者共同的任务。(By 李嘉诚)

wps7C7.tmp

这句话源自李嘉诚先生投资以色列理工学院广东汕头分院时的视频讲话中。国内现在的情况,博主个人认为至少在应有未来以下四个阶段,第一个阶段是传统IT时代,第二个阶段是云时代,第三个阶段是物联时代,第四个阶段生物网络时代。而目前,我觉得是处于第二阶段的并且正逐步开始涉猎第三阶段(各种穿戴设备)。如果你觉得你有能力,是不是至少应该为未来担负一点责任,我想VMCloud虽然更新进度慢,质量也不高,但至少能够为你参加云进程添砖加瓦,推波助澜(或许?)。

总的来说,我想VMCloud接下来要做的,可能就是尽可能的提供更好更完整的关于虚拟化、云计算方面的"技(Wu)术(Ren)向(Zi)导(Di)"。下图是VMCloud框架:

wps7E8.tmp

博客上的进度比较慢(主要因为确实没时间更新,往往只是写好了文档,没来得及上传),真实的进度如下图:

wps7F8.tmp

所以其实基本上VMCloud云平台关于Microsoft方面的是已经基本完成了(进阶篇的将不定期的来更新,也不会限制是否完结)。所以,接下来VMCloud 2015计划是:

  • 开始VMCloud云平台VMware私有云基础篇(主要涉及组件式vCS)及Microsoft私有云平台进阶篇的制作,并且实现Microsoft与VMware初步结合在VMCloud中;

  • 继续VMCloud讲坛Microsoft方面的讲坛(将不会全系列来讲,并不讲搭建类或者仅稍许带过搭建类讲坛);

  • 找机会或者平台,实施VMCloud云平台;

  • 此外,成就一部经典,就?p>阅读更多内容

没有评论:

发表评论