[原创]C#之探索发现:在WinForm上写的一个模拟分页小程序

今天闲来无事,由于手痒,特上来编写一个有趣的东西。每天都在用C#这门语言,我这人比较爱钻牛角尖。今天我钻到了在Winform上写一个模拟分页的小程序。

分页程序,大家都不陌生。下面我将要实现的是,在一个Form控件上,通过一个RichTextBox进行显示‘未使用分页’之前的原始数据;用另一个RichTextBox显示‘正在分页’时的数据。下面我传上几张图,大家就明白了。(今天写的这篇日志,打算与朋友们分享,本人才书学浅,万一有不对之处,还望批评指证!)


图片:一                           {显示的是界面,并且进行了分页显示,定位在第一页上}

图片:二                                    {我定位到了第2页,数据显式正常,能衔接上}

图片:三                                       {我直接定位到了尾页,总记录数1万条,每页显示11条,最后一页只剩1条,这个是没错的。}

上面先给大家展示了整个界面及显示效果。下面说一下我实现的方式:

这一万条数据,我是将其放在了List<string>集合类里面了。然后进行各种处理。仅做了最简单的分页跳转,用四个按钮“首页,上一页,下一页,尾页”进行跳转控制。

整个小程序说明了什么呢?我相信有一些朋友,在使用分页代码时,有可能直接就Copy现成的放在自己的工程中,对分页它到底是怎么处理的心里或许不清楚。下面我将贴上处理分页的代码,其实很简单。主要也是想让您,不仅知其然,还要尽可能的知其所以然。程序中我加入了尽可能全面的注释。

或许会有朋友说我在‘多此一举’,没关系,只是想让跟我一样喜欢探索的朋友,尽可能的发现一些想知道的东西罢了。

代码如下:[首先贴上来的就是核心处理程序,WinForm各控件的属性代码文件我就不贴了]

分页处理程序代码

  1 /*
2 * 由 左安坤 创建。
3 * 用户: Administrator
4 * 日期: 2011-9-14
5 * 时间: 9:29
6 *
7 *
8 *
9 1*1 0 1
10 2*1 (2-1) 2
11 3*1 (3-1) 3
12
13 ------------------
14 10
15
16 1*10 (10-1) 10
17 2*10 (20-10) 20
18 3*10 (30-20) 30
19 -------------------
20 公式: 分页原理
21
22 分页数
23
24 第一页 1 分页数
25
26 第二页 (当前页*分页数-分页数) 当前页*分页数
27 */
28
29 using System;
30 using System.Collections.Generic;
31 using System.Text;
32 using System.Drawing;
33 using System.Windows.Forms;
34
35 namespace MoniPage
36 {
37 /// <summary>
38 /// Description of MainForm.
39 /// </summary>
40 public partial class MainForm : Form
41 {
42 [STAThread]
43 public static void Main(string[] args)
44 {
45 Application.EnableVisualStyles();
46 Application.SetCompatibleTextRenderingDefault(false);
47 Application.Run(new MainForm());
48 }
49
50 public MainForm()
51 {
52 //
53 // The InitializeComponent() call is required for Windows Forms designer support.
54 //
55 InitializeComponent();
56
57 //
58 // TODO: Add constructor code after the InitializeComponent() call.
59 //
60 }
61
62 private List<string> Y_data = new List<string>(); //我自己声明的一个泛型集合,分页就是围绕它展开的----[模拟分页]
63
64 void Button1Click(object sender, EventArgs e) //自动填充数据
65 {
66
67 if(Y_data.Count<=0){
68 for(int i=1;i<10001;i++){
69 string str = String.Format("这是第{0}条数据。\r\n",i);
70 Y_data.Add(str);
71 }
72 Show_Data();
73 }
74 }
75
76 void Button2Click(object sender, EventArgs e) //清除数据
77 {
78 if(Y_data.Count>=0){
79 Y_data.Clear();
80 Show_Data();
81 richTextBox2.Text = "";
82 }
83 }
84
85 void Show_Data(){ //将数据显示在左侧框里
86
87 StringBuilder sb = new StringBuilder();
88 for(int i=0;i<Y_data.Count;i++){
89 sb.Append(String.Format("[{0,4:0000}] {1}",i+1,Y_data[i]));
90 if(i != (Y_data.Count-1)){
91 sb.Append(new string('-',20));
92 sb.Append("\r\n");
93 }
94 }
95 richTextBox1.Text = sb.ToString();
96 }
97 private int P_ageNum; //每页显示记录数
98 private int T_pages; //共多少页
99 private int Current_page = 1; //当前页,默认定位于第一页
100
101 void Button7Click(object sender, EventArgs e) //进行分页初始化
102 {
103 if((textBox1.Text == null)||(textBox1.Text == String.Empty)){
104 MessageBox.Show("请设置每页显示多少条信息!","设置分页条目:");
105 return;
106 }
107 if(!Int32.TryParse(textBox1.Text,out this.P_ageNum)){
108 MessageBox.Show("请输入合法的数字!","数字输入框:");
109 return;
110 }
111 if(this.P_ageNum<=0){
112 MessageBox.Show("您输入的是0或负数,无需分页操作!","非法设置:");
113 return;
114 }
115 if(this.P_ageNum > Y_data.Count){
116 MessageBox.Show("您输入的页数大于了总记录数!","非法设置:");
117 this.P_ageNum = 0;
118 return;
119 }
120 this.T_pages = Y_data.Count/this.P_ageNum;
121 if(Y_data.Count%this.P_ageNum != 0){
122 this.T_pages++;
123 }
124 label1.Text = String.Format("共:({0})页",this.T_pages);
125 Current_page = 1;
126 SplitPages();
127 }
128
129 void Button3Click(object sender, EventArgs e) //进行分页处理的程序
130 {
131 Button bn = sender as Button; //获取传递进来的Button属性
132 if(this.T_pages > 1){ //总页数只有大于1才有意义
133 switch(bn.Name){
134 case "FirstPage": //首页
135 if(this.Current_page>1){ //只有当前页大于1时,才会返回首页,否则本身就在首页呢
136 this.Current_page = 1; //直接将当前页定位到1
137 SplitPages();
138 }
139 break;
140 case "PreviousPage"://上一页
141 if(this.Current_page>1){ //只有当前页大于1时,上一页才有可能存在,否则本身就在首页呢
142 this.Current_page = this.Current_page-1; //往前翻一页
143 SplitPages();
144 }
145 break;
146 case "NextPage": //下一页
147 if(this.Current_page+1 <= this.T_pages){ //只有当前页+1,不超出总页数时,才有意义
148 this.Current_page = this.Current_page+1; //往后翻一页
149 SplitPages();
150 }
151 break;
152 case "LastPage": //尾页
153 if(this.Current_page<this.T_pages){ //唯有当前页小于总页数时,才有意义
154 this.Current_page = this.T_pages; //直接将当前页定位到尾页
155 SplitPages();
156 }
157 break;
158 default:
159 break;
160 }
161 }
162 }
163
164 void SplitPages(){ //分页结果处理
165 groupBox2.Text = String.Format("分页显示:当前第{0}页,共{1}条记录",this.Current_page,this.Y_data.Count);
166 StringBuilder sx = new StringBuilder(); //用来拼接查询出来的记录
167 //当前页 this.Current_page
168 //每页显示的条数 this.P_ageNum
169 /*
170 * 公式: 分页原理
171
172 *分页数
173
174 第一页 1 分页数
175
176 第二页 (当前页*分页数-分页数) 前页*分页数
177 */
178 int StartPage=0; //起始页
179 int EndPage = 0;
180 if(this.Current_page == 1){ //如果是第一页,则起始规则与其他页不同
181 StartPage = 0; //不管是数组,还是集合起始索引都是从0开始
182 EndPage = this.P_ageNum; //每页显示的页数
183 }
184 if(this.Current_page > 1){
185 StartPage = (this.Current_page*this.P_ageNum)-this.P_ageNum; //计算起始页
186 EndPage = this.Current_page*this.P_ageNum; //计算结束页
187
188 if(EndPage>Y_data.Count){ //若索引边界超出了总记录数,明显不符合常理
189 EndPage = Y_data.Count;
190 }
191 }
192 for(int i=StartPage;i<EndPage;i++){
193 sx.Append(String.Format("[{0,4:0000}] {1}",i+1,Y_data[i]));
194 if(i != (EndPage-1)){
195 sx.Append(new string('-',20));
196 sx.Append("\n");
197 }
198 }
199 richTextBox2.Text = sx.ToString();
200 }
201 }
202 }

希望此文能帮助到需要的朋友,当处理小数据量时,或许就可以自己编个分页控件耍耍。

本人能力确实有限,写不出太伟大、太高明的程序。欢迎各朋友给予批评指证,也欢迎与我探讨C#方面的技术。

原文地址:https://www.cnblogs.com/zuozuo/p/2176318.html