天天看點

【幹貨】再上資料分頁控件 ━ 更加靈活,更加實用

  實作分頁控件的代碼非常的簡單,下面直接給出全部源碼,大家可以參考下,整個分頁控件的源碼如下:

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>/// &lt;summary&gt;</code>

<code>    </code><code>/// 分頁使用者控件,僅提供分頁資訊顯示及改變頁碼操作</code>

<code>    </code><code>/// &lt;/summary&gt;</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>/// &lt;summary&gt; </code>

<code>        </code><code>/// 帶參數的構造函數</code>

<code>        </code><code>/// &lt;param name="pageSize"&gt;每頁記錄數&lt;/param&gt;</code>

<code>        </code><code>/// &lt;param name="recordCount"&gt;總記錄數&lt;/param&gt;</code>

<code>        </code><code>/// &lt;/summary&gt;</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 &lt; 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 &lt; 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 &gt; </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 &lt; 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 &gt; 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 &gt; 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 &lt; </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 &gt; 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 &lt; </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 &lt; 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 &gt; 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 &gt; </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 &lt; 1)</code>

<code>                </code><code>this</code><code>.RefreshData(num);</code>

<code>    </code><code>}</code>

<code>}</code>

代碼基本沒有什麼難度,相信大家都能看得懂,那麼如何使用這個控件呢?

  首先在生成的工具箱中拖動這個分頁控件到界面上,再後再做資料綁定的代碼即可。我直接展示一個已經做成的界面,如下圖所示:

【幹貨】再上資料分頁控件 ━ 更加靈活,更加實用

上面就是分頁的效果,如何實作的呢?下面給出實作代碼。

  我們可以在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 &gt; 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”方法可以任意實作,可以調用存儲過程,也可以使用代碼進行分頁。隻要傳回分頁的資料即可。

  下面給出一些分頁的效果,如下圖所示:

【幹貨】再上資料分頁控件 ━ 更加靈活,更加實用
【幹貨】再上資料分頁控件 ━ 更加靈活,更加實用

繼續閱讀