• [原创]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#方面的技术。

  • 相关阅读:
    【jekins】jenkins构建触发
    【Autoit】Autoit 使用
    docker 网络和/etc/docker/daemon.json文件详情
    kubernetes(k8s)集群安全机制RBAC
    linux文件目录颜色及特殊权限对应的颜色
    Python 爬取各大代理IP网站(元类封装)
    K8S 容器之间通讯方式
    kubernetes Pod的升级与回滚
    lvs+keepalived+mariadb集群
    kubernetes(k8s)Pod污点与容忍
  • 原文地址:https://www.cnblogs.com/zuozuo/p/2176318.html
Copyright © 2020-2023  润新知