實作分頁控件的代碼非常的簡單,下面直接給出全部源碼,大家可以參考下,整個分頁控件的源碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
<code>using</code> <code>System;</code>
<code>using</code> <code>System.ComponentModel;</code>
<code>using</code> <code>System.Windows.Forms;</code>
<code>namespace</code> <code>RDIFramework.Controls</code>
<code>{</code>
<code> </code><code>public</code> <code>delegate</code> <code>void</code> <code>PageChangedEventHandler(</code><code>object</code> <code>sender, EventArgs e);</code>
<code> </code><code>/// <summary></code>
<code> </code><code>/// 分頁使用者控件,僅提供分頁資訊顯示及改變頁碼操作</code>
<code> </code><code>/// </summary></code>
<code>public</code> <code>partial </code><code>class</code> <code>UcPagerEx : UserControl</code>
<code> </code><code>public</code> <code>event</code> <code>PageChangedEventHandler PageChanged;</code>
<code> </code><code>private</code> <code>int</code> <code>_pageSize;</code>
<code> </code><code>private</code> <code>int</code> <code>m_PageCount;</code>
<code> </code><code>private</code> <code>int</code> <code>_recordCount;</code>
<code> </code><code>private</code> <code>int</code> <code>_pageIndex;</code>
<code> </code><code>public</code> <code>UcPagerEx()</code>
<code> </code><code>{</code>
<code> </code><code>InitializeComponent();</code>
<code> </code><code>this</code><code>._pageSize = 10;</code>
<code> </code><code>this</code><code>._recordCount = 0;</code>
<code> </code><code>this</code><code>._pageIndex = 1; </code><code>//預設為第一頁</code>
<code> </code><code>}</code>
<code> </code><code>/// <summary> </code>
<code> </code><code>/// 帶參數的構造函數</code>
<code> </code><code>/// <param name="pageSize">每頁記錄數</param></code>
<code> </code><code>/// <param name="recordCount">總記錄數</param></code>
<code> </code><code>/// </summary></code>
<code> </code><code>public</code> <code>UcPagerEx(</code><code>int</code> <code>recordCount, </code><code>int</code> <code>pageSize)</code>
<code> </code><code>this</code><code>._pageSize = pageSize;</code>
<code> </code><code>this</code><code>._recordCount = recordCount;</code>
<code> </code><code>this</code><code>.InitPageInfo();</code>
<code> </code><code>protected</code> <code>virtual</code> <code>void</code> <code>OnPageChanged(EventArgs e)</code>
<code> </code><code>if</code> <code>(PageChanged != </code><code>null</code><code>)</code>
<code> </code><code>{</code>
<code> </code><code>InitPageInfo();</code>
<code> </code><code>PageChanged(</code><code>this</code><code>, e);</code>
<code> </code><code>}</code>
<code> </code><code>[Description(</code><code>"設定或擷取一頁中顯示的記錄數目"</code><code>), DefaultValue(20), Category(</code><code>"分頁"</code><code>)]</code>
<code> </code><code>public</code> <code>int</code> <code>PageSize</code>
<code> </code><code>set</code>
<code> </code><code>this</code><code>._pageSize = value;</code>
<code> </code><code>get</code>
<code> </code><code>return</code> <code>this</code><code>._pageSize;</code>
<code> </code><code>[Description(</code><code>"擷取記錄總頁數"</code><code>), DefaultValue(0), Category(</code><code>"分頁"</code><code>)]</code>
<code> </code><code>public</code> <code>int</code> <code>PageCount</code>
<code> </code><code>return</code> <code>this</code><code>.m_PageCount;</code>
<code> </code><code>[Description(</code><code>"設定或擷取記錄總數"</code><code>), Category(</code><code>"分頁"</code><code>)]</code>
<code> </code><code>public</code> <code>int</code> <code>RecordCount</code>
<code> </code><code>this</code><code>._recordCount = value;</code>
<code> </code><code>return</code> <code>this</code><code>._recordCount;</code>
<code> </code><code>[Description(</code><code>"目前的頁面索引, 開始為1"</code><code>), DefaultValue(0), Category(</code><code>"分頁"</code><code>)]</code>
<code> </code><code>[Browsable(</code><code>false</code><code>)]</code>
<code> </code><code>public</code> <code>int</code> <code>PageIndex</code>
<code> </code><code>this</code><code>._pageIndex = value;</code>
<code> </code><code>return</code> <code>this</code><code>._pageIndex;</code>
<code> </code><code>/// 初始化分頁資訊</code>
<code> </code><code>public</code> <code>void</code> <code>InitPageInfo(</code><code>int</code> <code>recordCount, </code><code>int</code> <code>pageSize)</code>
<code> </code><code>public</code> <code>void</code> <code>InitPageInfo(</code><code>int</code> <code>recordCount)</code>
<code> </code><code>public</code> <code>void</code> <code>InitPageInfo()</code>
<code> </code><code>if</code> <code>(</code><code>this</code><code>._pageSize < 1)</code>
<code> </code><code>this</code><code>._pageSize = 10; </code><code>//如果每頁記錄數不正确,即更改為10</code>
<code> </code><code>if</code> <code>(</code><code>this</code><code>._recordCount < 0)</code>
<code> </code><code>this</code><code>._recordCount = 0; </code><code>//如果記錄總數不正确,即更改為0</code>
<code> </code><code>//取得總頁數</code>
<code> </code><code>if</code> <code>(</code><code>this</code><code>._recordCount % </code><code>this</code><code>._pageSize == 0)</code>
<code> </code><code>this</code><code>.m_PageCount = </code><code>this</code><code>._recordCount / </code><code>this</code><code>._pageSize;</code>
<code> </code><code>else</code>
<code> </code><code>this</code><code>.m_PageCount = </code><code>this</code><code>._recordCount / </code><code>this</code><code>._pageSize + 1;</code>
<code> </code><code>//設定目前頁</code>
<code> </code><code>if</code> <code>(</code><code>this</code><code>._pageIndex > </code><code>this</code><code>.m_PageCount)</code>
<code> </code><code>this</code><code>._pageIndex = </code><code>this</code><code>.m_PageCount;</code>
<code> </code><code>if</code> <code>(</code><code>this</code><code>._pageIndex < 1)</code>
<code> </code><code>this</code><code>._pageIndex = 1;</code>
<code> </code><code>//設定上一頁按鈕的可用性</code>
<code> </code><code>bool</code> <code>enable = (</code><code>this</code><code>.PageIndex > 1);</code>
<code> </code><code>this</code><code>.btnPrevious.Enabled = enable;</code>
<code> </code><code>//設定首頁按鈕的可用性</code>
<code> </code><code>enable = (</code><code>this</code><code>.PageIndex > 1);</code>
<code> </code><code>this</code><code>.btnFirst.Enabled = enable;</code>
<code> </code><code>//設定下一頁按鈕的可用性</code>
<code> </code><code>enable = (</code><code>this</code><code>.PageIndex < </code><code>this</code><code>.PageCount);</code>
<code> </code><code>this</code><code>.btnNext.Enabled = enable;</code>
<code> </code><code>//設定末頁按鈕的可用性</code>
<code> </code><code>this</code><code>.btnLast.Enabled = enable;</code>
<code> </code><code>this</code><code>.txtPageIndex.Text = </code><code>this</code><code>._pageIndex.ToString();</code>
<code> </code><code>this</code><code>.lblPageInfo.Text = </code><code>string</code><code>.Format(</code><code>"共 {0} 條記錄,每頁 {1} 條,共 {2} 頁"</code><code>, </code><code>this</code><code>._recordCount, </code><code>this</code><code>._pageSize, </code><code>this</code><code>.m_PageCount);</code>
<code> </code><code>public</code> <code>void</code> <code>RefreshData(</code><code>int</code> <code>page)</code>
<code> </code><code>this</code><code>._pageIndex = page;</code>
<code> </code><code>EventArgs e = </code><code>new</code> <code>EventArgs();</code>
<code> </code><code>OnPageChanged(e);</code>
<code> </code><code>private</code> <code>void</code> <code>btnFirst_Click(</code><code>object</code> <code>sender, System.EventArgs e)</code>
<code> </code><code>this</code><code>.RefreshData(1);</code>
<code> </code><code>private</code> <code>void</code> <code>btnPrevious_Click(</code><code>object</code> <code>sender, System.EventArgs e)</code>
<code> </code><code>if</code> <code>(</code><code>this</code><code>._pageIndex > 1)</code>
<code> </code><code>this</code><code>.RefreshData(</code><code>this</code><code>._pageIndex - 1);</code>
<code> </code><code>this</code><code>.RefreshData(1);</code>
<code> </code><code>private</code> <code>void</code> <code>btnNext_Click(</code><code>object</code> <code>sender, System.EventArgs e)</code>
<code> </code><code>if</code> <code>(</code><code>this</code><code>._pageIndex < </code><code>this</code><code>.m_PageCount)</code>
<code> </code><code>this</code><code>.RefreshData(</code><code>this</code><code>._pageIndex + 1);</code>
<code> </code><code>else</code> <code>if</code> <code>(</code><code>this</code><code>.m_PageCount < 1)</code>
<code> </code><code>this</code><code>.RefreshData(</code><code>this</code><code>.m_PageCount);</code>
<code> </code><code>private</code> <code>void</code> <code>btnLast_Click(</code><code>object</code> <code>sender, System.EventArgs e)</code>
<code> </code><code>this</code><code>.RefreshData(</code><code>this</code><code>.m_PageCount > 0 ? </code><code>this</code><code>.m_PageCount : 1);</code>
<code> </code><code>private</code> <code>void</code> <code>txtPageIndex_KeyDown(</code><code>object</code> <code>sender, System.Windows.Forms.KeyEventArgs e)</code>
<code> </code><code>if</code> <code>(e.KeyCode == Keys.Enter)</code>
<code> </code><code>int</code> <code>num;</code>
<code> </code><code>try</code>
<code> </code><code>{</code>
<code> </code><code>num = Convert.ToInt16(</code><code>this</code><code>.txtPageIndex.Text);</code>
<code> </code><code>}</code>
<code> </code><code>catch</code>
<code> </code><code>num = 1;</code>
<code> </code><code>if</code> <code>(num > </code><code>this</code><code>.m_PageCount)</code>
<code> </code><code>num = </code><code>this</code><code>.m_PageCount;</code>
<code> </code><code>if</code> <code>(num < 1)</code>
<code> </code><code>this</code><code>.RefreshData(num);</code>
<code> </code><code>}</code>
<code>}</code>
代碼基本沒有什麼難度,相信大家都能看得懂,那麼如何使用這個控件呢?
首先在生成的工具箱中拖動這個分頁控件到界面上,再後再做資料綁定的代碼即可。我直接展示一個已經做成的界面,如下圖所示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuUjN1gTO1ATOyMDM2EDNw8CXxATNxAjMvwlM3UzN1EzLcd2bsJ2Lc12bj5yZvxmY0lmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
上面就是分頁的效果,如何實作的呢?下面給出實作代碼。
我們可以在Load事件中調用下面的Search()方法對資料進行綁定,如下代碼所示:
<code>private</code> <code>void</code> <code>Search()</code>
<code> </code><code>var</code> <code>recordCount = 0; </code>
<code> </code><code>this</code><code>.DTProductInfo = GetData(</code><code>out</code> <code>recordCount, ucPager.PageIndex, ucPager.PageSize, </code><code>this</code><code>.searchValue);</code>
<code> </code><code>ucPager.RecordCount = recordCount;</code>
<code> </code><code>ucPager.InitPageInfo();</code>
<code> </code><code>// 加載綁定資料</code>
<code> </code><code>this</code><code>.GetList();</code>
<code>private</code> <code>DataTable GetData(</code><code>out</code> <code>int</code> <code>recordCount, </code><code>int</code> <code>pageIndex, </code><code>int</code> <code>pageSize,</code><code>string</code> <code>search)</code>
<code> </code><code>return</code> <code>new</code> <code>ProductInfoManager(dbProvider).GetDTByPage(</code><code>out</code> <code>recordCount, pageIndex, pageSize, search,ProductInfoTable.FieldCreateOn + </code><code>" DESC "</code><code>);</code>
<code>public</code> <code>override</code> <code>void</code> <code>GetList()</code>
<code> </code><code>this</code><code>.dgvProductInfo.AutoGenerateColumns = </code><code>false</code><code>;</code>
<code> </code><code>if</code> <code>(</code><code>this</code><code>.DTProductInfo.Columns.Count > 0)</code>
<code> </code><code>{</code>
<code> </code><code>this</code><code>.DTProductInfo.DefaultView.Sort = ProductInfoTable.FieldCreateOn;</code>
<code> </code><code>this</code><code>.dgvProductInfo.DataSource = </code><code>this</code><code>.DTProductInfo.DefaultView;</code>
<code> </code><code>this</code><code>.SetControlState();</code>
同時需要對UcPagerEx的PageChanged事件做處理,以啟用使用者分頁的需求,代碼如下:
<code>private</code> <code>void</code> <code>ucPager_PageChanged(</code><code>object</code> <code>sender, EventArgs e)</code>
<code> </code><code>var</code> <code>holdCursor = </code><code>this</code><code>.Cursor;</code>
<code> </code><code>this</code><code>.Cursor = Cursors.WaitCursor;</code>
<code> </code><code>Search();</code>
<code> </code><code>this</code><code>.Cursor = holdCursor;</code>
附注:對于上面的“GetDTByPage”方法可以任意實作,可以調用存儲過程,也可以使用代碼進行分頁。隻要傳回分頁的資料即可。
下面給出一些分頁的效果,如下圖所示: