-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsearch.xml
More file actions
519 lines (374 loc) · 176 KB
/
Copy pathsearch.xml
File metadata and controls
519 lines (374 loc) · 176 KB
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title><![CDATA[Idea之安装激活]]></title>
<url>/2017/09/13/Idea%E4%B9%8B%E5%AE%89%E8%A3%85%E6%BF%80%E6%B4%BB/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[Oracle数据库之cmd命令清除注册表]]></title>
<url>/2017/09/13/Oracle%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B9%8Bcmd%E5%91%BD%E4%BB%A4%E6%B8%85%E9%99%A4%E6%B3%A8%E5%86%8C%E8%A1%A8/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[申请属于自己的GitHub]]></title>
<url>/2017/09/13/%E7%94%B3%E8%AF%B7%E5%B1%9E%E4%BA%8E%E8%87%AA%E5%B7%B1%E7%9A%84GitHub/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[小乌龟之使用入门]]></title>
<url>/2017/09/13/%E5%B0%8F%E4%B9%8C%E9%BE%9F%E4%B9%8B%E4%BD%BF%E7%94%A8%E5%85%A5%E9%97%A8/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[小乌龟之安装配置]]></title>
<url>/2017/09/13/%E5%B0%8F%E4%B9%8C%E9%BE%9F%E4%B9%8B%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[hexo之常用命令]]></title>
<url>/2017/09/13/hexo%E4%B9%8B%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[hexo之配置简介]]></title>
<url>/2017/09/13/hexo%E4%B9%8B%E9%85%8D%E7%BD%AE%E7%AE%80%E4%BB%8B/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[hexo博客安装配置]]></title>
<url>/2017/09/13/hexo%E5%8D%9A%E5%AE%A2%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[winfrom/WPF之定时器]]></title>
<url>/2017/09/13/winfrom-WPF%E4%B9%8B%E5%AE%9A%E6%97%B6%E5%99%A8/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[Oracle数据库之安装配置]]></title>
<url>/2017/09/13/Oracle%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B9%8B%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[SQL server2012安装配置]]></title>
<url>/2017/09/13/SQL-server2012%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[SQL server数据库链接配置]]></title>
<url>/2017/09/13/SQL-server%E6%95%B0%E6%8D%AE%E5%BA%93%E9%93%BE%E6%8E%A5%E9%85%8D%E7%BD%AE/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[JAVA之数据库连接]]></title>
<url>/2017/09/13/JAVA%E4%B9%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[Android之另类if循环判断]]></title>
<url>/2017/09/13/Android%E4%B9%8B%E5%8F%A6%E7%B1%BBif%E5%BE%AA%E7%8E%AF%E5%88%A4%E6%96%AD/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[Android之Date控件]]></title>
<url>/2017/09/13/Android%E4%B9%8BDate%E6%8E%A7%E4%BB%B6/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[Android之常用事件]]></title>
<url>/2017/09/13/Android%E4%B9%8B%E5%B8%B8%E7%94%A8%E4%BA%8B%E4%BB%B6/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[Android之更新模块]]></title>
<url>/2017/09/13/Android%E4%B9%8B%E6%9B%B4%E6%96%B0%E6%A8%A1%E5%9D%97/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[Android之框架xUtil入门]]></title>
<url>/2017/09/13/Android%E4%B9%8B%E6%A1%86%E6%9E%B6xUtil%E5%85%A5%E9%97%A8/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[JAVA]]></title>
<url>/2017/08/27/JAVA/</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[权限树的使用]]></title>
<url>/2017/08/26/%E6%9D%83%E9%99%90%E6%A0%91%E7%9A%84%E4%BD%BF%E7%94%A8/</url>
<content type="html"><![CDATA[<h1 id="权限"><a href="#权限" class="headerlink" title="权限"></a>权限</h1><p>权限加载/权限遍历/权限添加/权限删除</p>
<h2 id="权限树加载"><a href="#权限树加载" class="headerlink" title="权限树加载"></a>权限树加载</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">trevzqx.Nodes.Clear();//清空树节点</div><div class="line"> setTreeView(trevzqx, 0);//总权限树加载</div><div class="line"> trevzqx.ExpandAll();//展开根节点</div></pre></td></tr></table></figure>
<p>绑定数据库权限树加载<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div></pre></td><td class="code"><pre><div class="line">/// <summary></div><div class="line"> /// 加载权限</div><div class="line"> /// </summary></div><div class="line"> /// <param name="sender"></param></div><div class="line"> /// <param name="e"></param></div><div class="line"> //调用的时候parentId以0值开始 setTreeView(treeView1, 0);</div><div class="line"> private void setTreeView(TreeView tr1, int parentId)</div><div class="line"> { </div><div class="line"> string nihao = comboBox1.SelectedValue.ToString();</div><div class="line"></div><div class="line"> string sql = "SELECT id,nodeName,parentId FROM TreeTest tt LEFT JOIN tb_user_type ty ON ty.btnid=tt.id WHERE ty.usertype='" + nihao + "'and tt.parentId='" + parentId + "'ORDER BY tt.id ASC";</div><div class="line"> // string sql = "select * from tb_user_type ,TreeTest where parentId=" + parentId;</div><div class="line"></div><div class="line"> DataTable ds = SqlHelper.ExecuteDataTable(sql);</div><div class="line"> </div><div class="line"> if (ds.Rows.Count > 0)</div><div class="line"> {</div><div class="line"> int pId = -1;</div><div class="line"> foreach (DataRow row in ds.Rows)</div><div class="line"> {</div><div class="line"> TreeNode node = new TreeNode();</div><div class="line"> node.Text = row["nodeName"].ToString();</div><div class="line"> node.Tag = (int)row["id"];</div><div class="line"> pId = (int)row["parentId"];</div><div class="line"> if (pId == 0)</div><div class="line"> {</div><div class="line"> //添加根节点</div><div class="line"> tr1.Nodes.Add(node);</div><div class="line"> }</div><div class="line"> else</div><div class="line"> {</div><div class="line"> //添加根节点之外的其他节点</div><div class="line"> RefreshChildNode(tr1, node, pId);</div><div class="line"> }</div><div class="line"> //查找以node为父节点的子节点</div><div class="line"> setTreeView(tr1, (int)node.Tag);</div><div class="line"></div><div class="line"> }</div><div class="line"> }</div><div class="line"> </div><div class="line"> </div><div class="line"> }</div><div class="line"> </div><div class="line"></div><div class="line"> </div><div class="line"> //处理根节点的子节点</div><div class="line"> private void RefreshChildNode(TreeView tr1, TreeNode treeNode, int parentId)</div><div class="line"> {</div><div class="line"> foreach (TreeNode node in tr1.Nodes)</div><div class="line"> {</div><div class="line"> if ((int)node.Tag == parentId)</div><div class="line"> {</div><div class="line"> node.Nodes.Add(treeNode);</div><div class="line"> return;</div><div class="line"> }</div><div class="line"> else if (node.Nodes.Count > 0)</div><div class="line"> {</div><div class="line"> FindChildNode(node, treeNode, parentId);</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"> //处理根节点的子节点的子节点</div><div class="line"> private void FindChildNode(TreeNode tNode, TreeNode treeNode, int parentId)</div><div class="line"> {</div><div class="line"></div><div class="line"> foreach (TreeNode node in tNode.Nodes)</div><div class="line"> {</div><div class="line"> if ((int)node.Tag == parentId)</div><div class="line"> {</div><div class="line"> node.Nodes.Add(treeNode);</div><div class="line"> return;</div><div class="line"> }</div><div class="line"> else if (node.Nodes.Count > 0)</div><div class="line"> {</div><div class="line"> FindChildNode(node, treeNode, parentId);</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> }</div><div class="line"> </div><div class="line"> }</div></pre></td></tr></table></figure></p>
<h2 id="权限遍历"><a href="#权限遍历" class="headerlink" title="权限遍历"></a>权限遍历</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">MenuDAL dal = new MenuDAL();</div><div class="line"> List<MenuModel> objList = dal.findMyObjByRoleId(((LoginForm)this.Owner).cbxtype.SelectedValue.ToString());</div><div class="line"> if (objList.Count > 0)</div><div class="line"> {</div><div class="line"> foreach (MenuModel obj in objList)</div><div class="line"> {</div><div class="line"> if ("主页" == obj.nodeName)</div><div class="line"> {</div><div class="line"> this.tabPage1.Parent = tabControl1; </div><div class="line"> }</div></pre></td></tr></table></figure>
<h2 id="权限添加"><a href="#权限添加" class="headerlink" title="权限添加"></a>权限添加</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div></pre></td><td class="code"><pre><div class="line">/// <summary></div><div class="line"> /// 添加权限</div><div class="line"> /// </summary></div><div class="line"> /// <param name="sender"></param></div><div class="line"> /// <param name="e"></param></div><div class="line"> private void btnAddTotal_Click(object sender, EventArgs e)//添加父节点</div><div class="line"> {</div><div class="line"> if (tvquanxian.SelectedNode == null)</div><div class="line"> {</div><div class="line"> MessageBox.Show("请选择权限");</div><div class="line"> return;</div><div class="line"> }</div><div class="line"> /* if (string.IsNullOrEmpty(textBox1.Text.Trim()))//添加节点</div><div class="line"> {</div><div class="line"> MessageBox.Show("请填写要添加的节点名称!");</div><div class="line"> return;</div><div class="line"> }*/</div><div class="line"> string id = tvquanxian.SelectedNode.Tag.ToString();</div><div class="line"> string nihao = comboBox1.SelectedValue.ToString();</div><div class="line"> PermitModel obj = new PermitModel();</div><div class="line"> obj.usertype = nihao;</div><div class="line"> obj.btnid = id;</div><div class="line"> PermitDAL dal = new PermitDAL();</div><div class="line"> int num = dal.findObjCountByUserquanxian(obj);</div><div class="line"> if (0 == num)</div><div class="line"> {</div><div class="line"> string sql = "insert into tb_user_type values(newid(),'" + nihao + "','" + tvquanxian.SelectedNode.Tag.ToString() + "'" + ")";</div><div class="line"> id = (string)SqlHelper.ExecuteScalar(sql);</div><div class="line"> TreeNode node1 = new TreeNode();</div><div class="line"> node1.Tag = id;</div><div class="line"> node1.Text = tvquanxian.SelectedNode.Text.ToString();</div><div class="line"> trevzqx.Nodes.Clear();//清空树节点</div><div class="line"> setTreeView(trevzqx, 0);//总权限树加载</div><div class="line"> trevzqx.ExpandAll();</div><div class="line"> MessageBox.Show("添加权限成功!");</div><div class="line"> }</div><div class="line"> else MessageBox.Show("添加失败,请核实后添加权限!");</div><div class="line"> </div><div class="line"> //tvquanxian.Nodes.Add(node1);</div><div class="line"> //textBox1.Text = "";</div><div class="line"> }</div></pre></td></tr></table></figure>
<h2 id="权限遍历删除"><a href="#权限遍历删除" class="headerlink" title="权限遍历删除"></a>权限遍历删除</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div></pre></td><td class="code"><pre><div class="line">/// <summary></div><div class="line"> /// 删除权限</div><div class="line"> /// </summary></div><div class="line"> /// <param name="sender"></param></div><div class="line"> /// <param name="e"></param></div><div class="line"> private void btnDelete_Click(object sender, EventArgs e)</div><div class="line"> {</div><div class="line"> if (trevzqx.SelectedNode == null)</div><div class="line"> {</div><div class="line"> MessageBox.Show("请选择要删除的节点!");</div><div class="line"> return;</div><div class="line"> }</div><div class="line"> //选中节点的主键id,也是其子节点的parentId</div><div class="line"> int id = (int)trevzqx.SelectedNode.Tag;</div><div class="line"> nodeDelete(id);</div><div class="line"> trevzqx.SelectedNode.Remove();</div><div class="line"> }</div><div class="line"> //数据表中的数据的递归删除方法</div><div class="line"> public void nodeDelete(int id)</div><div class="line"> {</div><div class="line"> string nihao = comboBox1.SelectedValue.ToString();</div><div class="line"></div><div class="line"> string sql = "SELECT id,nodeName,parentId FROM TreeTest tt LEFT JOIN tb_user_type ty ON ty.btnid=tt.id WHERE ty.usertype='" + nihao + "'and tt.parentId=" + id;</div><div class="line"> </div><div class="line"> // string sql = "select * from TreeTest where parentId=" + id;</div><div class="line"> DataTable ds = SqlHelper.ExecuteDataTable(sql);</div><div class="line"> if (ds.Rows.Count > 0)</div><div class="line"> {</div><div class="line"> //有子节点</div><div class="line"> foreach (DataRow row in ds.Rows)</div><div class="line"> {</div><div class="line"> //先删除父节点</div><div class="line"> string delete = "delete from tb_user_type where usertype='" + nihao + "'and btnid=" + id;</div><div class="line"> int k = SqlHelper.ExecuteNonQuery(delete);</div><div class="line"> //查找子节点,删除</div><div class="line"> int id1 = (int)row["id"];</div><div class="line"> nodeDelete(id1);</div><div class="line"> }</div><div class="line"> }</div><div class="line"> else</div><div class="line"> {</div><div class="line"> //没有子节点</div><div class="line"> string delete = "delete from tb_user_type where usertype='" + nihao + "'and btnid=" + id;</div><div class="line"> int k = SqlHelper.ExecuteNonQuery(delete);</div><div class="line"> MessageBox.Show("删除成功");</div><div class="line"> }</div><div class="line"> }</div></pre></td></tr></table></figure>]]></content>
<tags>
<tag> C# </tag>
<tag> 权限树 </tag>
</tags>
</entry>
<entry>
<title><![CDATA[C#-SqlHelper]]></title>
<url>/2017/08/26/C-SqlHelper/</url>
<content type="html"><![CDATA[<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div></pre></td><td class="code"><pre><div class="line">class SqlHelper</div><div class="line"> {</div><div class="line"> public static readonly string dbConnStr = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;</div><div class="line"></div><div class="line"> //增删改 操作</div><div class="line"> public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)</div><div class="line"> {</div><div class="line"></div><div class="line"> using (SqlConnection conn = new SqlConnection(dbConnStr))</div><div class="line"> {</div><div class="line"> conn.Open();</div><div class="line"> using (SqlCommand cmd = conn.CreateCommand())</div><div class="line"> {</div><div class="line"> cmd.CommandText = sql;</div><div class="line"> if (null != parameters)</div><div class="line"> {</div><div class="line"> cmd.Parameters.AddRange(parameters);</div><div class="line"> }</div><div class="line"> return cmd.ExecuteNonQuery();</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> //查询 操作</div><div class="line"> public static object ExecuteScalar(string sql, params SqlParameter[] parameters)</div><div class="line"> {</div><div class="line"> using (SqlConnection conn = new SqlConnection(dbConnStr))</div><div class="line"> {</div><div class="line"> conn.Open();</div><div class="line"> using (SqlCommand cmd = conn.CreateCommand())</div><div class="line"> {</div><div class="line"> cmd.CommandText = sql;</div><div class="line"> if (null != parameters)</div><div class="line"> {</div><div class="line"> cmd.Parameters.AddRange(parameters);</div><div class="line"> }</div><div class="line"></div><div class="line"> return cmd.ExecuteScalar();</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> //查询结果少的sql </div><div class="line"> public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters)</div><div class="line"> {</div><div class="line"> using (SqlConnection conn = new SqlConnection(dbConnStr))</div><div class="line"> {</div><div class="line"> conn.Open();</div><div class="line"> using (SqlCommand cmd = conn.CreateCommand())</div><div class="line"> {</div><div class="line"> cmd.CommandText = sql;</div><div class="line"> if (null != parameters)</div><div class="line"> {</div><div class="line"> cmd.Parameters.AddRange(parameters);</div><div class="line"> }</div><div class="line"></div><div class="line"> SqlDataAdapter adapter = new SqlDataAdapter(cmd);</div><div class="line"> DataSet dataSet = new DataSet();</div><div class="line"> adapter.Fill(dataSet);</div><div class="line"> return dataSet.Tables[0];</div><div class="line"> </div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> //查询结果少的sql </div><div class="line"> public static DataSet ExecuteDataSet(string sql,SqlParameter[] parameters,String cls)</div><div class="line"> {</div><div class="line"> using (SqlConnection conn = new SqlConnection(dbConnStr))</div><div class="line"> {</div><div class="line"> conn.Open();</div><div class="line"> using (SqlCommand cmd = conn.CreateCommand())</div><div class="line"> {</div><div class="line"> cmd.CommandText = sql;</div><div class="line"> if (null != parameters)</div><div class="line"> {</div><div class="line"> cmd.Parameters.AddRange(parameters);</div><div class="line"> }</div><div class="line"></div><div class="line"> SqlDataAdapter adapter = new SqlDataAdapter(cmd);</div><div class="line"> DataSet dataSet = new DataSet();</div><div class="line"> adapter.Fill(dataSet, cls);</div><div class="line"> // return dataSet.Tables[0];</div><div class="line"> return dataSet;</div><div class="line"></div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> public static object FromDbValue(object value)</div><div class="line"> {</div><div class="line"> if (value == DBNull.Value)</div><div class="line"> {</div><div class="line"> return null;</div><div class="line"> }</div><div class="line"> else</div><div class="line"> {</div><div class="line"> return value;</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> public static object ToDbValue(object value)</div><div class="line"> {</div><div class="line"> if (value == null)</div><div class="line"> {</div><div class="line"> return DBNull.Value;</div><div class="line"> }</div><div class="line"> else</div><div class="line"> {</div><div class="line"> return value;</div><div class="line"> }</div><div class="line"> }</div></pre></td></tr></table></figure>]]></content>
<tags>
<tag> C# </tag>
<tag> SqlHelper </tag>
</tags>
</entry>
<entry>
<title><![CDATA[C#-Excel导出]]></title>
<url>/2017/08/26/C-Excel%E5%AF%BC%E5%87%BA/</url>
<content type="html"><![CDATA[<h1 id="导出Excel文件"><a href="#导出Excel文件" class="headerlink" title="导出Excel文件"></a>导出Excel文件</h1><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div></pre></td><td class="code"><pre><div class="line">//导出功能</div><div class="line"> private void exportBtn_Click(object sender, RoutedEventArgs e)</div><div class="line"> {</div><div class="line"> SaveFileDialog saveFileDialog = new SaveFileDialog();</div><div class="line"> saveFileDialog.Filter = "Excel (*.XLS)|*.xls"; ;</div><div class="line"> if ((bool)(saveFileDialog.ShowDialog()))</div><div class="line"> {</div><div class="line"> try</div><div class="line"> {</div><div class="line"> ExcelHelper _excelHelper = new ExcelHelper();</div><div class="line"> GoodsLogDAL dal=new GoodsLogDAL();</div><div class="line"> ReportModel obj = new ReportModel();</div><div class="line"> if (null != startTimeDp.Value)</div><div class="line"> {</div><div class="line"> obj.startTime = startTimeDp.Value;</div><div class="line"> }</div><div class="line"> if (null != endTimeDp.Value)</div><div class="line"> {</div><div class="line"> obj.endTime = endTimeDp.Value;</div><div class="line"> }</div><div class="line"> if (null != nameTbp.Text && "" != nameTbp.Text)</div><div class="line"> {</div><div class="line"> obj.name = nameTbp.Text;</div><div class="line"> }</div><div class="line"> if ("全部" != (string)((ComboBoxItem)typeCbp.SelectedItem).Content)</div><div class="line"> {</div><div class="line"> obj.type = (string)((ComboBoxItem)typeCbp.SelectedItem).Content;</div><div class="line"> }</div><div class="line"> </div><div class="line"> _excelHelper.SaveToExcel(saveFileDialog.FileName, dal.findObjList(obj));</div><div class="line"> MessageBox.Show("导出成功");</div><div class="line"> }</div><div class="line"> catch (Exception ex)</div><div class="line"> {</div><div class="line"> MessageBox.Show("导出失败:" + ex.Message);</div><div class="line"> }</div><div class="line"> </div><div class="line"></div><div class="line"> }</div></pre></td></tr></table></figure>
<h2 id="ExcelHelper文件"><a href="#ExcelHelper文件" class="headerlink" title="ExcelHelper文件"></a>ExcelHelper文件</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div><div class="line">126</div><div class="line">127</div><div class="line">128</div><div class="line">129</div><div class="line">130</div><div class="line">131</div><div class="line">132</div><div class="line">133</div><div class="line">134</div><div class="line">135</div><div class="line">136</div><div class="line">137</div><div class="line">138</div><div class="line">139</div><div class="line">140</div><div class="line">141</div><div class="line">142</div><div class="line">143</div><div class="line">144</div><div class="line">145</div><div class="line">146</div><div class="line">147</div><div class="line">148</div><div class="line">149</div><div class="line">150</div><div class="line">151</div><div class="line">152</div><div class="line">153</div><div class="line">154</div><div class="line">155</div><div class="line">156</div><div class="line">157</div><div class="line">158</div><div class="line">159</div><div class="line">160</div><div class="line">161</div><div class="line">162</div><div class="line">163</div><div class="line">164</div><div class="line">165</div><div class="line">166</div><div class="line">167</div><div class="line">168</div><div class="line">169</div><div class="line">170</div><div class="line">171</div><div class="line">172</div><div class="line">173</div><div class="line">174</div><div class="line">175</div><div class="line">176</div><div class="line">177</div><div class="line">178</div><div class="line">179</div><div class="line">180</div><div class="line">181</div><div class="line">182</div><div class="line">183</div><div class="line">184</div><div class="line">185</div><div class="line">186</div><div class="line">187</div><div class="line">188</div><div class="line">189</div><div class="line">190</div><div class="line">191</div><div class="line">192</div><div class="line">193</div><div class="line">194</div><div class="line">195</div><div class="line">196</div><div class="line">197</div><div class="line">198</div><div class="line">199</div><div class="line">200</div><div class="line">201</div><div class="line">202</div><div class="line">203</div><div class="line">204</div><div class="line">205</div><div class="line">206</div><div class="line">207</div><div class="line">208</div><div class="line">209</div><div class="line">210</div><div class="line">211</div><div class="line">212</div><div class="line">213</div><div class="line">214</div><div class="line">215</div><div class="line">216</div><div class="line">217</div><div class="line">218</div><div class="line">219</div><div class="line">220</div><div class="line">221</div><div class="line">222</div><div class="line">223</div><div class="line">224</div><div class="line">225</div><div class="line">226</div><div class="line">227</div><div class="line">228</div><div class="line">229</div><div class="line">230</div><div class="line">231</div><div class="line">232</div><div class="line">233</div><div class="line">234</div><div class="line">235</div><div class="line">236</div><div class="line">237</div><div class="line">238</div><div class="line">239</div><div class="line">240</div></pre></td><td class="code"><pre><div class="line">public class ExcelHelper</div><div class="line"> {</div><div class="line"> private _Excel.Application _excelApp = null;</div><div class="line"> private _Excel.Workbooks _books = null;</div><div class="line"> private _Excel._Workbook _book = null;</div><div class="line"> private _Excel.Sheets _sheets = null;</div><div class="line"> private _Excel._Worksheet _sheet = null;</div><div class="line"> private _Excel.Range _range = null;</div><div class="line"> private _Excel.Font _font = null;</div><div class="line"> // Optional argument variable</div><div class="line"> private object _optionalValue = Missing.Value;</div><div class="line"></div><div class="line"> /// <summary></div><div class="line"> /// 读取Excel文件</div><div class="line"> /// </summary></div><div class="line"> /// <param name="pPath"></param></div><div class="line"> /// <returns></returns></div><div class="line"> public DataTable LoadExcel(string pPath)</div><div class="line"> {</div><div class="line"> //Driver={Driver do Microsoft Excel(*.xls)} 这种连接写法不需要创建一个数据源DSN,DRIVERID表示驱动ID,Excel2003后都使用790,FIL表示Excel文件类型,Excel2007用excel 8.0,MaxBufferSize表示缓存大小,DBQ表示读取Excel的文件名(全路径)</div><div class="line"></div><div class="line"> string connString = "Driver={Driver do Microsoft Excel(*.xls)};DriverId=790;SafeTransactions=0;ReadOnly=1;MaxScanRows=16;Threads=3;MaxBufferSize=2024;UserCommitSync=Yes;FIL=excel 8.0;PageTimeout=5;";</div><div class="line"> connString += "DBQ=" + pPath;</div><div class="line"> OdbcConnection conn = new OdbcConnection(connString);</div><div class="line"> OdbcCommand cmd = new OdbcCommand();</div><div class="line"> cmd.Connection = conn;</div><div class="line"> //获取Excel中第一个Sheet名称,作为查询时的表名</div><div class="line"> string sheetName = this.GetExcelSheetName(pPath);</div><div class="line"> string sql = "select * from [" + sheetName.Replace('.', '#') + "$]";</div><div class="line"> cmd.CommandText = sql;</div><div class="line"> OdbcDataAdapter da = new OdbcDataAdapter(cmd);</div><div class="line"> DataSet ds = new DataSet();</div><div class="line"> try</div><div class="line"> {</div><div class="line"> da.Fill(ds);</div><div class="line"> return ds.Tables[0];</div><div class="line"> }</div><div class="line"> catch (Exception x)</div><div class="line"> {</div><div class="line"> ds = null;</div><div class="line"> throw new Exception("从Excel文件中获取数据时发生错误!");</div><div class="line"> }</div><div class="line"> finally</div><div class="line"> {</div><div class="line"> cmd.Dispose();</div><div class="line"> cmd = null;</div><div class="line"> da.Dispose();</div><div class="line"> da = null;</div><div class="line"> if (conn.State == ConnectionState.Open)</div><div class="line"> {</div><div class="line"> conn.Close();</div><div class="line"> }</div><div class="line"> conn = null;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> private string GetExcelSheetName(string pPath)</div><div class="line"> {</div><div class="line"> //打开一个Excel应用</div><div class="line"></div><div class="line"> _excelApp = new _Excel.Application();</div><div class="line"> if (_excelApp == null)</div><div class="line"> {</div><div class="line"> throw new Exception("打开Excel应用时发生错误!");</div><div class="line"> }</div><div class="line"> _books = _excelApp.Workbooks;</div><div class="line"> //打开一个现有的工作薄</div><div class="line"> _book = _books.Add(pPath);</div><div class="line"> _sheets = _book.Sheets;</div><div class="line"> //选择第一个Sheet页</div><div class="line"> _sheet = (_Excel._Worksheet)_sheets.get_Item(1);</div><div class="line"> string sheetName = _sheet.Name;</div><div class="line"></div><div class="line"> ReleaseCOM(_sheet);</div><div class="line"> ReleaseCOM(_sheets);</div><div class="line"> ReleaseCOM(_book);</div><div class="line"> ReleaseCOM(_books);</div><div class="line"> _excelApp.Quit();</div><div class="line"> ReleaseCOM(_excelApp);</div><div class="line"> return sheetName;</div><div class="line"> }</div><div class="line"> /// <summary></div><div class="line"> /// 释放COM对象</div><div class="line"> /// </summary></div><div class="line"> /// <param name="pObj"></param></div><div class="line"> private void ReleaseCOM(object pObj)</div><div class="line"> {</div><div class="line"> try</div><div class="line"> {</div><div class="line"> System.Runtime.InteropServices.Marshal.ReleaseComObject(pObj);</div><div class="line"> }</div><div class="line"> catch</div><div class="line"> {</div><div class="line"> throw new Exception("释放资源时发生错误!");</div><div class="line"> }</div><div class="line"> finally</div><div class="line"> {</div><div class="line"> pObj = null;</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> /// <summary></div><div class="line"> /// 保存到Excel</div><div class="line"> /// </summary></div><div class="line"> /// <param name="excelName"></param></div><div class="line"> public void SaveToExcel(string excelName,DataTable dataTable)</div><div class="line"> {</div><div class="line"> try</div><div class="line"> {</div><div class="line"> if (dataTable != null)</div><div class="line"> {</div><div class="line"> if (dataTable.Rows.Count != 0)</div><div class="line"> {</div><div class="line"> Mouse.SetCursor(Cursors.Wait);</div><div class="line"> CreateExcelRef();</div><div class="line"> FillSheet(dataTable);</div><div class="line"> SaveExcel(excelName);</div><div class="line"> Mouse.SetCursor(Cursors.Arrow);</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"> catch (Exception e)</div><div class="line"> {</div><div class="line"> MessageBox.Show("Error while generating Excel report");</div><div class="line"> }</div><div class="line"> finally</div><div class="line"> {</div><div class="line"> ReleaseCOM(_sheet);</div><div class="line"> ReleaseCOM(_sheets);</div><div class="line"> ReleaseCOM(_book);</div><div class="line"> ReleaseCOM(_books);</div><div class="line"> ReleaseCOM(_excelApp);</div><div class="line"> }</div><div class="line"> }</div><div class="line"> </div><div class="line"> /// <summary></div><div class="line"> /// 将内存中Excel保存到本地路径</div><div class="line"> /// </summary></div><div class="line"> /// <param name="excelName"></param></div><div class="line"> private void SaveExcel(string excelName)</div><div class="line"> {</div><div class="line"> _excelApp.Visible = false;</div><div class="line"> //保存为Office2003和Office2007都兼容的格式</div><div class="line"> _book.SaveAs(excelName, Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel8, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);</div><div class="line"> _excelApp.Quit();</div><div class="line"></div><div class="line"> }</div><div class="line"> </div><div class="line"> /// <summary></div><div class="line"> /// 将数据填充到内存Excel的工作表</div><div class="line"> /// </summary></div><div class="line"> /// <param name="dataTable"></param></div><div class="line"> private void FillSheet(DataTable dataTable)</div><div class="line"> {</div><div class="line"> object[] header = CreateHeader(dataTable);</div><div class="line"> WriteData(header,dataTable);</div><div class="line"> }</div><div class="line"> </div><div class="line"></div><div class="line"> private void WriteData(object[] header,DataTable dataTable)</div><div class="line"> {</div><div class="line"> object[,] objData = new object[dataTable.Rows.Count, header.Length];</div><div class="line"></div><div class="line"> for (int j = 0; j < dataTable.Rows.Count; j++)</div><div class="line"> {</div><div class="line"> var item = dataTable.Rows[j];</div><div class="line"> for (int i = 0; i < header.Length; i++)</div><div class="line"> {</div><div class="line"> var y = dataTable.Rows[j][i];</div><div class="line"> objData[j, i] = (y == null) ? "" : y.ToString();</div><div class="line"> }</div><div class="line"> }</div><div class="line"> AddExcelRows("A2", dataTable.Rows.Count, header.Length, objData);</div><div class="line"> AutoFitColumns("A1", dataTable.Rows.Count + 1, header.Length);</div><div class="line"> }</div><div class="line"> </div><div class="line"></div><div class="line"> private void AutoFitColumns(string startRange, int rowCount, int colCount)</div><div class="line"> {</div><div class="line"> _range = _sheet.get_Range(startRange, _optionalValue);</div><div class="line"> _range = _range.get_Resize(rowCount, colCount);</div><div class="line"> _range.Columns.AutoFit();</div><div class="line"> }</div><div class="line"> </div><div class="line"></div><div class="line"> private object[] CreateHeader(DataTable dataTable)</div><div class="line"> {</div><div class="line"> </div><div class="line"> List<object> objHeaders = new List<object>();</div><div class="line"> for (int n = 0; n < dataTable.Columns.Count; n++)</div><div class="line"> {</div><div class="line"> objHeaders.Add(dataTable.Columns[n].ColumnName);</div><div class="line"> }</div><div class="line"></div><div class="line"> var headerToAdd = objHeaders.ToArray();</div><div class="line"> //工作表的单元是从“A1”开始</div><div class="line"> AddExcelRows("A1", 1, headerToAdd.Length, headerToAdd);</div><div class="line"> SetHeaderStyle();</div><div class="line"></div><div class="line"> return headerToAdd;</div><div class="line"> }</div><div class="line"></div><div class="line"> /// <summary></div><div class="line"> /// 将表头加粗显示</div><div class="line"> /// </summary></div><div class="line"> private void SetHeaderStyle()</div><div class="line"> {</div><div class="line"> _font = _range.Font;</div><div class="line"> _font.Bold = true;</div><div class="line"> }</div><div class="line"> </div><div class="line"> /// <summary></div><div class="line"> /// 将数据填充到Excel工作表的单元格中</div><div class="line"> /// </summary></div><div class="line"> /// <param name="startRange"></param></div><div class="line"> /// <param name="rowCount"></param></div><div class="line"> /// <param name="colCount"></param></div><div class="line"> /// <param name="values"></param></div><div class="line"> private void AddExcelRows(string startRange, int rowCount, int colCount, object values)</div><div class="line"> {</div><div class="line"> _range = _sheet.get_Range(startRange, _optionalValue);</div><div class="line"> _range = _range.get_Resize(rowCount, colCount);</div><div class="line"> _range.set_Value(_optionalValue, values);</div><div class="line"> }</div><div class="line"> /// <summary></div><div class="line"> /// 创建一个Excel程序实例</div><div class="line"> /// </summary></div><div class="line"> private void CreateExcelRef()</div><div class="line"> {</div><div class="line"> _excelApp = new _Excel.Application();</div><div class="line"> _books = (_Excel.Workbooks)_excelApp.Workbooks;</div><div class="line"> _book = (_Excel._Workbook)(_books.Add(_optionalValue));</div><div class="line"> _sheets = (_Excel.Sheets)_book.Worksheets;</div><div class="line"> _sheet = (_Excel._Worksheet)(_sheets.get_Item(1));</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"></div><div class="line"></div><div class="line"></div><div class="line"> }</div></pre></td></tr></table></figure>]]></content>
<tags>
<tag> C# </tag>
<tag> ExcelHelper </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Winfrom 全局变量的使用]]></title>
<url>/2017/08/26/Winfrom-%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%E7%9A%84%E4%BD%BF%E7%94%A8/</url>
<content type="html"><![CDATA[<p> 定义全局变量,这样在任何一个界面都可以获取并使用,最常用的一个事情来说,就是很多页面可能都会获取登陆用户的用户名,主要空可能会添加一个状态栏,显示是谁登陆的,这样我们就可以定义一个全局变量,我是放在了<br>Program,也可以自己定义一个类文件,<br>Program里面定义一个静态,例子如下:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">public static string loginname = "";//全局变量用户名字</div></pre></td></tr></table></figure></p>
<p>在登录窗口给它赋值,例子如下:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Program.loginname = ttbusername.Text;//定义全局变量</div></pre></td></tr></table></figure></p>
<p>获取使用,例子如下:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">String newb= Program.loginname;</div></pre></td></tr></table></figure></p>
]]></content>
<tags>
<tag> C# </tag>
<tag> Winfrom </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Winfrom的Combobox控件]]></title>
<url>/2017/08/20/WinFprm%E4%B8%ADCombobox%E6%8E%A7%E4%BB%B6/</url>
<content type="html"><![CDATA[<h1 id="Winfrom的Combobox控件"><a href="#Winfrom的Combobox控件" class="headerlink" title="Winfrom的Combobox控件"></a>Winfrom的Combobox控件</h1><p>@()[WinForm|Combobox控件|]</p>
<h1 id="ComboBox控件"><a href="#ComboBox控件" class="headerlink" title="ComboBox控件"></a>ComboBox控件</h1><p>@()[WinForm|Combobox|]</p>
<p><strong>Combobox控件的问题</strong><br>Combobox为下拉选择菜单</p>
<h4 id="Combobox有三种模式为"><a href="#Combobox有三种模式为" class="headerlink" title="Combobox有三种模式为:"></a>Combobox有三种模式为<strong>:</strong></h4><ul>
<li><strong>【DropDown】:</strong>可以编辑,也可以下拉选择</li>
<li><strong>【Simple】:</strong>可以编辑,具体不清楚,可能通过事件可以自动补全</li>
<li><strong>【DropDownList】:</strong>禁止编辑只能下拉选择<br>###Combobox的数据填充<br>第一:<br>以控件编辑器直接写死<br>第二;<br>以代码方式add添加第三种动态获取【根据需求使用,例如性别就俩值男女,直接add写死】</li>
</ul>
<p><strong>第一种【遍历添加】</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">1. private void DoBindData() </div><div class="line">2. { </div><div class="line">3. for (int i = 0; i < 5; i++) </div><div class="line">4. { </div><div class="line">5. comboBox1.Items.Add(i + 1); </div><div class="line">6. } </div><div class="line">7. }</div></pre></td></tr></table></figure></p>
<p><strong>第二种进行数据源绑定:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div></pre></td><td class="code"><pre><div class="line">1. private void DoBindDataSource() </div><div class="line">2. { </div><div class="line">3. //构造数据源(或从数据库中查询) </div><div class="line">4. DataTable ADt = new DataTable(); </div><div class="line">5. DataColumn ADC1 = new DataColumn("F_ID", typeof(int)); </div><div class="line">6. DataColumn ADC2 = new DataColumn("F_Name", typeof(string)); </div><div class="line">7. ADt.Columns.Add(ADC1); </div><div class="line">8. ADt.Columns.Add(ADC2); </div><div class="line">9. for (int i = 0; i < 3; i++) </div><div class="line">10. { </div><div class="line">11. DataRow ADR = ADt.NewRow(); </div><div class="line">12. ADR[0] = i+1; </div><div class="line">13. ADR[1] = "Name_" + (i+1); </div><div class="line">14. ADt.Rows.Add(ADR); </div><div class="line">15. } </div><div class="line">16. //进行绑定 </div><div class="line">17. comboBox1.DisplayMember = "F_Name";//控件显示的列名 </div><div class="line">18. comboBox1.ValueMember = "F_ID";//控件值的列名 </div><div class="line">19. comboBox1.DataSource = ADt; </div><div class="line">20. }</div></pre></td></tr></table></figure></p>
<p><strong>第三种数据库类型的数据源绑定</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">1. public void usertype()//加载用户类型</div><div class="line">2. {</div><div class="line">3. DataTable table = SqlHelper.ExecuteDataTable(书写SQL语句);</div><div class="line">4. cbxtype.DataSource = table;</div><div class="line">5. cbxtype.DisplayMember = "tb_name";//显示的值</div><div class="line">6. cbxtype.ValueMember = "GUID";//实际选项值</div><div class="line">7. this.tbxxibie.SelectedIndex = -1;//首次默认选项</div><div class="line">8. }</div></pre></td></tr></table></figure></p>
<p>####Combobox的第三种模式【DropDownList】<br> 由于这种模式是禁止编辑的,如果查询是作为条件查询,启动程序第一次的时候没关系,但是一旦SelectedIndex了之后就无法改为空值,这样查找全部数据的时候就会出现错误,所谓为了防止这种情况的出现,我们一般都会添加一个默认值,例如:“请添加”,“请选择”,下面说一下我的思路:</p>
<p>#####Combobox的item排序<br> Oder by后面的case when 一个值then 数字(让前面的值第几个显示,0为第一个)else 1 end(else 后面的数字为其它的值从1开始排序到结束)<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">1. where tb_num=1 or tb_num=6 order by case when tb_name='---请选择---' then 0 else 1 end</div></pre></td></tr></table></figure></p>
<p>###逻辑思路:<br>即在数据库的属性添加一行唯一分组唯一值,例如:“请添加”,“请选择”</p>
<p>这样我们把这个值和其他固定的类型分组的值一同填充到控件里面,就是在sql语句where后面添加一个or+这个唯一分组;</p>
<p>然后我们对这个combobox控件进行判断,combobox的.Text就是显示的值,value是实际值,我就对控件进行是否为空是否为空字符串进行判断,简单的方法就是对length(长度)进行判断;</p>
<p>同时或一个条件,combobox的Text值与上面的唯一值“请添加”,“请选择”进行双等号的比对,如果是双等于就让该控件为空,这样dal里面的sql语句where后面就不会添加该条件,就达到了我们想要的让它为空的目的;</p>
<p>if的判断有了,当然还有一个else,else当然是让它等于选择的item了<br>逻辑思路到此结束!<br>例如:(我这里是做的不等于判断,也就不需要else)<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">1. if ("---请选择---" != tbxruxue.Text.ToString() && null != tbxruxue.SelectedValue)</div><div class="line">2. { </div><div class="line">3. peopleModel.people_ruxue = tbxruxue.SelectedValue.ToString();</div><div class="line">4. }</div></pre></td></tr></table></figure></p>
<hr>
<p>感谢阅读这份帮助文档。</p>
]]></content>
<tags>
<tag> C# </tag>
<tag> 控件 </tag>
<tag> WinForm </tag>
<tag> Combobox控件 </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Winfrom的TreeView控件常用属性]]></title>
<url>/2017/08/20/WinFprm%E4%B8%ADTreeView%E5%B8%B8%E7%94%A8%E5%B1%9E%E6%80%A7/</url>
<content type="html"><![CDATA[<h1 id="Winfrom的TreeView控件常用属性"><a href="#Winfrom的TreeView控件常用属性" class="headerlink" title="Winfrom的TreeView控件常用属性"></a>Winfrom的TreeView控件常用属性</h1><p>@()[WinForm|权限树|TreeView]</p>
<p><strong>TreeView</strong>组件是由多个类来定义的,TreeView组件是由命名空间”System.Windows .Forms”中的”TreeView”类来定义的,而其中的节点(即Node),是由命名空间”System.Windows .Forms”中的”TreeNode”来定义的。所以当在程序中创建一个TreeView对象,其实只是创建了一个可以放置节点的”容器”。而在这个容器中加入一个节点,其实就是加入了从”TreeNode”类中创建的一个节点对象;同样删除一个节点,也就是删除一个”TreeNode”节点对象。</p>
<pre><code>TreeView组件虽然是一个操作起来比较麻烦的组件,但归根到底,可以总结为三种基本操作:加入子节点、加入兄弟节点和删除节点。掌握了这三种常用操作,对于在编程中灵活运用TreeView组件是十分必要的。下面就分别来加以介绍。
</code></pre><ul>
<li><p><strong>加入子节点</strong> :首先要在TreeView组件中定位要加入的子节点的位置,然后创建一个节点对象,然后利用TreeVeiw类中对节点的加入方法(即:Add ( )方法),加入此节点对象。<br>//首先判断是否选定组件中的位置</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line">if ( treeView1.SelectedNode == null )</div><div class="line">{</div><div class="line">MessageBox.Show ( "请选择一个节点" , "提示信息" , </div><div class="line">MessageBoxButtons.OK , MessageBoxIcon.Information ) ;</div><div class="line">}</div><div class="line">else</div><div class="line">{</div><div class="line">//创建一个节点对象,并初始化</div><div class="line">TreeNode tmp ;</div><div class="line">tmp = new TreeNode ( "节点名称" ) ;</div><div class="line">//在TreeView组件中加入子节点</div><div class="line">treeView1.SelectedNode.Nodes.Add ( tmp ) ;</div><div class="line">treeView1.SelectedNode = tmp ;</div><div class="line">treeView1.ExpandAll ( ) ;</div><div class="line">}</div></pre></td></tr></table></figure>
</li>
<li><p><strong>加入平级节点</strong> :具体代码如下<br>//首先判断是否选定组件中节点的位置</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">if ( treeView1.SelectedNode == null )</div><div class="line">{</div><div class="line">MessageBox.Show ( "请选择一个节点" , "提示信息" , </div><div class="line">MessageBoxButtons.OK , MessageBoxIcon.Information ) ;</div><div class="line">}</div><div class="line">else</div><div class="line">{</div><div class="line">//创建一个节点对象,并初始化</div><div class="line">TreeNode tmp ;</div><div class="line">tmp = new TreeNode ( textBox1.Text ) ;</div><div class="line">//在TreeView组件中加入兄弟节点</div><div class="line">treeView1.SelectedNode.Parent.Nodes.Add ( tmp ) ;</div><div class="line">treeView1.ExpandAll ( ) ;</div><div class="line">}</div></pre></td></tr></table></figure>
</li>
<li><p><strong>删除节点</strong> :代码如下。<br>//判断选定的节点是否存在下一级节点</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">if ( treeView1.SelectedNode.Nodes.Count == 0 )</div><div class="line">//删除节点</div><div class="line">treeView1.SelectedNode.Remove ( ) ;</div><div class="line">else</div><div class="line">MessageBox.Show ( "请先删除此节点中的子节点!" , "提示信</div><div class="line">息" , MessageBoxButtons.OK , </div><div class="line">MessageBoxIcon.Information ) ;</div></pre></td></tr></table></figure>
</li>
<li><p><strong>展开所有节点</strong> :代码如下。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">/定位根节点</div><div class="line">treeView1.SelectedNode = treeView1.Nodes [ 0 ] ;</div><div class="line">//展开组件中的所有节点</div><div class="line">treeView1.SelectedNode.ExpandAll ( ) ;</div></pre></td></tr></table></figure>
</li>
<li><p><strong>展开所有节点</strong> :代码如下。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">treeView1.SelectedNode.Expand ( ) ;</div><div class="line">//定位根节点</div><div class="line">treeView1.SelectedNode = treeView1.Nodes [ 0 ] ;</div><div class="line">//折叠组件中所有节点</div><div class="line">treeView1.SelectedNode.Collapse ( ) ;</div></pre></td></tr></table></figure>
</li>
</ul>
<hr>
<p>感谢阅读这份帮助文档。</p>
]]></content>
<tags>
<tag> C# </tag>
<tag> 控件 </tag>
<tag> WinForm </tag>
<tag> 权限树 </tag>
<tag> TreeView控件 </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Winfrom的TreeView控件数据库绑定]]></title>
<url>/2017/08/20/WinFprm%E4%B8%ADTreeView%E6%95%B0%E6%8D%AE%E5%BA%93%E7%BB%91%E5%AE%9A/</url>
<content type="html"><![CDATA[<h1 id="Winfrom的TreeView控件数据库绑定"><a href="#Winfrom的TreeView控件数据库绑定" class="headerlink" title="Winfrom的TreeView控件数据库绑定"></a>Winfrom的TreeView控件数据库绑定</h1><p>@()[WinForm|权限树|TreeView]</p>
<h1 id="绑定TreeView"><a href="#绑定TreeView" class="headerlink" title="绑定TreeView"></a>绑定TreeView</h1><p><strong>绑定TreeView(利用TreeNode)</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div></pre></td><td class="code"><pre><div class="line">/// <summary></div><div class="line">/// 绑定TreeView(利用TreeNode)</div><div class="line">/// </summary></div><div class="line">/// <param name="p_Node">TreeNode(TreeView的一个节点)</param></div><div class="line">/// <param name="pid_val">父id的值</param></div><div class="line">/// <param name="id">数据库 id 字段名</param></div><div class="line">/// <param name="pid">数据库 父id 字段名</param></div><div class="line">/// <param name="text">数据库 文本 字段值</param></div><div class="line">protected void Bind_Tv(DataTable dt, TreeNode p_Node, string pid_val, string id, string pid, string text)</div><div class="line">{</div><div class="line"> DataView dv = new DataView(dt);//将DataTable存到DataView中,以便于筛选数据</div><div class="line"> TreeNode tn;//建立TreeView的节点(TreeNode),以便将取出的数据添加到节点中</div><div class="line"> //以下为三元运算符,如果父id为空,则为构建“父id字段 is null”的查询条件,否则构建“父id字段=父id字段值”的查询条件</div><div class="line"> string filter = string.IsNullOrEmpty(pid_val) ? pid + " is null" : string.Format(pid + "='{0}'", pid_val);</div><div class="line"> dv.RowFilter = filter;//利用DataView将数据进行筛选,选出相同 父id值 的数据</div><div class="line"> foreach (DataRowView row in dv)</div><div class="line"> {</div><div class="line"> tn = new TreeNode();//建立一个新节点(学名叫:一个实例)</div><div class="line"> if (p_Node == null)//如果为根节点</div><div class="line"> {</div><div class="line"> tn.Name = row[id].ToString();//节点的Value值,一般为数据库的id值</div><div class="line"> tn.Text = row[text].ToString();//节点的Text,节点的文本显示</div><div class="line"> TreeView1.Nodes.Add(tn);//将该节点加入到TreeView中</div><div class="line"> Bind_Tv(dt, tn, tn.Name, id, pid, text);//递归(反复调用这个方法,直到把数据取完为止)</div><div class="line"> }</div><div class="line"> else//如果不是根节点</div><div class="line"> {</div><div class="line"> tn.Name = row[id].ToString();//节点Value值</div><div class="line"> tn.Text = row[text].ToString();//节点Text值</div><div class="line"> p_Node.Nodes.Add(tn);//该节点加入到上级节点中</div><div class="line"> Bind_Tv(dt, tn, tn.Name, id, pid, text);//递归</div><div class="line"> }</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure></p>
<p><strong>绑定TreeView(利用TreeNodeCollection)</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div></pre></td><td class="code"><pre><div class="line">/// <summary></div><div class="line">/// 绑定TreeView(利用TreeNodeCollection)</div><div class="line">/// </summary></div><div class="line">/// <param name="tnc">TreeNodeCollection(TreeView的节点集合)</param></div><div class="line">/// <param name="pid_val">父id的值</param></div><div class="line">/// <param name="id">数据库 id 字段名</param></div><div class="line">/// <param name="pid">数据库 父id 字段名</param></div><div class="line">/// <param name="text">数据库 文本 字段值</param></div><div class="line">private void Bind_Tv(DataTable dt, TreeNodeCollection tnc, string pid_val, string id, string pid, string text)</div><div class="line">{</div><div class="line"> DataView dv = new DataView(dt);//将DataTable存到DataView中,以便于筛选数据</div><div class="line"> TreeNode tn;//建立TreeView的节点(TreeNode),以便将取出的数据添加到节点中</div><div class="line"> //以下为三元运算符,如果父id为空,则为构建“父id字段 is null”的查询条件,否则构建“父id字段=父id字段值”的查询条件</div><div class="line"> string filter = string.IsNullOrEmpty(pid_val) ? pid + " is null" : string.Format(pid + "='{0}'", pid_val);</div><div class="line"> dv.RowFilter = filter;//利用DataView将数据进行筛选,选出相同 父id值 的数据</div><div class="line"> foreach (DataRowView drv in dv)</div><div class="line"> {</div><div class="line"> tn = new TreeNode();//建立一个新节点(学名叫:一个实例)</div><div class="line"> tn.Name = drv[id].ToString();//节点的Value值,一般为数据库的id值</div><div class="line"> tn.Text = drv[text].ToString();//节点的Text,节点的文本显示</div><div class="line"> tnc.Add(tn);//将该节点加入到TreeNodeCollection(节点集合)中</div><div class="line"> Bind_Tv(dt, tn.Nodes, tn.Name, id, pid, text);//递归(反复调用这个方法,直到把数据取完为止)</div><div class="line"> }</div><div class="line">}</div><div class="line">#endregion</div></pre></td></tr></table></figure></p>
<hr>
<blockquote>
<p>更多资料请加群获取</p>
</blockquote>
]]></content>
<tags>
<tag> C# </tag>
<tag> 控件 </tag>
<tag> WinForm </tag>
<tag> 权限树 </tag>
<tag> TreeView控件 </tag>
</tags>
</entry>
<entry>
<title><![CDATA[欢迎来到我的个人博客]]></title>
<url>/2017/08/02/%E6%AC%A2%E8%BF%8E%E6%9D%A5%E5%88%B0%E6%88%91%E7%9A%84%E5%8D%9A%E5%AE%A2/</url>
<content type="html"><![CDATA[<blockquote><p>本博客只是用来记录个人在和代码打交道的生涯中碰到的一些问题以及解决方案,还有一些无意中发现的小技巧等等,供以后用来查阅。</p>
</blockquote>
<h2 id="反馈与建议"><a href="#反馈与建议" class="headerlink" title="反馈与建议"></a>反馈与建议</h2><ul>
<li>微博:<a href="http://weibo.com/u/5811462452" target="_blank" rel="external">@Microera</a>,<a href="http://weibo.com/u/5811462452" target="_blank" rel="external">@朕封你为妃_</a></li>
<li>邮箱:<a href="mailto:zero@zerodeg.cn">zero@zerodeg.cn</a></li>
<li>群号:512901469[<a href="https://jq.qq.com/?_wv=1027&k=4FIJvv0" target="_blank" rel="external">点我加群</a>]</li>
</ul>
]]></content>
<tags>
<tag> 简介 </tag>
</tags>
</entry>
<entry>
<title><![CDATA[WinFprm中DataGridView控件的使用]]></title>
<url>/2017/08/02/WinFprm%E4%B8%ADDataGridView%E6%8E%A7%E4%BB%B6%E7%9A%84%E4%BD%BF%E7%94%A8/</url>
<content type="html"><![CDATA[<p>##datagridview控件使用前言</p>
<p>由于最近使用winform来写程序,因为系统需要,使用到了datagridview控件,在网上查阅了大量的资料,最后可以整理为两种模式,一种较为简单,但是如果多次使用到这个控件会导致出现大量重复代码,不是最优化的效果,但是不利于后期修改,这不是我们想要的结果,第二种较为繁琐,封装成一个类,然后引用封装的这个类就可以了,这样提高了代码利用率!</p>
<blockquote>
<ul>
<li><p><strong>第一种:</strong> 获取数据库配置信息,new一个链接,做一个查询,返回生成一个table,然后再填充到控件。 </p>
</li>
<li><p><strong>第二种:</strong> 将第一种封装成一个类,然后里面的写成变量,传递参数,然后调用就可以,方便快捷省事。</p>
</li>
</ul>
</blockquote>
<h3 id="第一种"><a href="#第一种" class="headerlink" title="第一种"></a>第一种</h3><p>//连接数据库读取数据,为DataGridView赋值。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line"> String strConn = "server= .\XWPC_DATABASE;uid=数据库用户名;pwd=数据库密码;database=数据库名";</div><div class="line">SqlConnection conn = new SqlConnection(strConn);</div><div class="line">String sqlId = "select * from [USER] ";</div><div class="line">conn.Open();</div><div class="line">SqlCommand cmd = new SqlCommand(sqlId, conn);</div><div class="line">SqlDataAdapter da = new SqlDataAdapter(cmd);</div><div class="line"></div><div class="line">DataSet ds = new DataSet();</div><div class="line">da.Fill(ds, "USER");</div><div class="line"></div><div class="line">DataGridView.DataSource = ds;</div><div class="line">DataGridView.DataMember = "USER";</div><div class="line"></div><div class="line">conn.Close();</div></pre></td></tr></table></figure></p>
<h3 id="第二种"><a href="#第二种" class="headerlink" title="第二种"></a>第二种</h3><blockquote>
<p>将第一种的语句封装到一个类,调用</p>
</blockquote>
<h4 id="举例子"><a href="#举例子" class="headerlink" title="举例子"></a>举例子</h4><p>例如封装到sqlhelper类中<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div></pre></td><td class="code"><pre><div class="line">public static DataSet ExecuteDataSet(string sql,SqlParameter[] parameters,String cls)</div><div class="line"> {</div><div class="line"> using (SqlConnection conn = new SqlConnection(dbConnStr))</div><div class="line"> {</div><div class="line"> conn.Open();</div><div class="line"> using (SqlCommand cmd = conn.CreateCommand())</div><div class="line"> {</div><div class="line"> cmd.CommandText = sql;</div><div class="line"> if (null != parameters)</div><div class="line"> {</div><div class="line"> cmd.Parameters.AddRange(parameters);</div><div class="line"> }</div><div class="line"></div><div class="line"> SqlDataAdapter adapter = new SqlDataAdapter(cmd);</div><div class="line"> DataSet dataSet = new DataSet();</div><div class="line"> adapter.Fill(dataSet, cls);</div><div class="line"> // return dataSet.Tables[0];</div><div class="line"> return dataSet;</div><div class="line"> </div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> }</div><div class="line">``` </div><div class="line">引用</div><div class="line">```c#</div><div class="line">PeopleModel peopleModel = new PeopleModel();</div><div class="line">peopleModel.people_name=tbxname.Text.Trim();</div><div class="line">peopleModel.people_ruxue = tbxruxue.Text.Trim();</div><div class="line">peopleModel.people_xibie = tbxxibie.Text.Trim();</div><div class="line">peopleModel.people_zhuanye = tbxzhuanye.Text.Trim();</div><div class="line">peopleModel.people_qq = tbxqq.Text.Trim();</div><div class="line"></div><div class="line">PeopleDAL peopleDAL = new PeopleDAL();</div><div class="line">this.studentlist.DataSource = peopleDAL.findObjCount(peopleModel, "T_Class");</div><div class="line">his.studentlist.AutoGenerateColumns = false;//关闭自动增加的列</div><div class="line">this.studentlist.DataMember = "T_Class";</div></pre></td></tr></table></figure></p>
<h4 id="常用属性"><a href="#常用属性" class="headerlink" title="常用属性"></a>常用属性</h4><p>取得当前单元格内容<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Console.WriteLine(DataGridView1.CurrentCell.Value);</div></pre></td></tr></table></figure></p>
<p>取得当前单元格的列 Index<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex);</div></pre></td></tr></table></figure></p>
<p>取得当前单元格的行 Index<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Console.WriteLine(DataGridView1.CurrentCell.RowIndex);</div></pre></td></tr></table></figure></p>
<h2 id="其他属性"><a href="#其他属性" class="headerlink" title="其他属性"></a>其他属性</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div><div class="line">126</div><div class="line">127</div><div class="line">128</div><div class="line">129</div><div class="line">130</div><div class="line">131</div><div class="line">132</div><div class="line">133</div><div class="line">134</div><div class="line">135</div><div class="line">136</div><div class="line">137</div><div class="line">138</div><div class="line">139</div><div class="line">140</div><div class="line">141</div><div class="line">142</div><div class="line">143</div><div class="line">144</div><div class="line">145</div><div class="line">146</div><div class="line">147</div><div class="line">148</div><div class="line">149</div><div class="line">150</div><div class="line">151</div><div class="line">152</div><div class="line">153</div><div class="line">154</div><div class="line">155</div><div class="line">156</div><div class="line">157</div><div class="line">158</div><div class="line">159</div><div class="line">160</div><div class="line">161</div><div class="line">162</div><div class="line">163</div><div class="line">164</div><div class="line">165</div><div class="line">166</div><div class="line">167</div><div class="line">168</div><div class="line">169</div><div class="line">170</div><div class="line">171</div><div class="line">172</div><div class="line">173</div><div class="line">174</div><div class="line">175</div><div class="line">176</div><div class="line">177</div><div class="line">178</div><div class="line">179</div><div class="line">180</div><div class="line">181</div><div class="line">182</div><div class="line">183</div><div class="line">184</div><div class="line">185</div><div class="line">186</div><div class="line">187</div><div class="line">188</div><div class="line">189</div><div class="line">190</div><div class="line">191</div><div class="line">192</div><div class="line">193</div><div class="line">194</div><div class="line">195</div><div class="line">196</div><div class="line">197</div><div class="line">198</div><div class="line">199</div><div class="line">200</div><div class="line">201</div><div class="line">202</div><div class="line">203</div><div class="line">204</div><div class="line">205</div><div class="line">206</div><div class="line">207</div><div class="line">208</div><div class="line">209</div><div class="line">210</div><div class="line">211</div><div class="line">212</div><div class="line">213</div><div class="line">214</div><div class="line">215</div><div class="line">216</div><div class="line">217</div><div class="line">218</div><div class="line">219</div><div class="line">220</div><div class="line">221</div><div class="line">222</div><div class="line">223</div><div class="line">224</div><div class="line">225</div><div class="line">226</div><div class="line">227</div><div class="line">228</div><div class="line">229</div><div class="line">230</div><div class="line">231</div><div class="line">232</div><div class="line">233</div><div class="line">234</div><div class="line">235</div><div class="line">236</div><div class="line">237</div><div class="line">238</div><div class="line">239</div><div class="line">240</div><div class="line">241</div><div class="line">242</div><div class="line">243</div><div class="line">244</div><div class="line">245</div><div class="line">246</div><div class="line">247</div><div class="line">248</div><div class="line">249</div><div class="line">250</div><div class="line">251</div><div class="line">252</div><div class="line">253</div><div class="line">254</div><div class="line">255</div><div class="line">256</div><div class="line">257</div><div class="line">258</div><div class="line">259</div><div class="line">260</div><div class="line">261</div><div class="line">262</div><div class="line">263</div><div class="line">264</div><div class="line">265</div><div class="line">266</div><div class="line">267</div><div class="line">268</div><div class="line">269</div><div class="line">270</div><div class="line">271</div><div class="line">272</div><div class="line">273</div><div class="line">274</div><div class="line">275</div><div class="line">276</div><div class="line">277</div><div class="line">278</div><div class="line">279</div><div class="line">280</div><div class="line">281</div><div class="line">282</div><div class="line">283</div><div class="line">284</div><div class="line">285</div><div class="line">286</div><div class="line">287</div><div class="line">288</div><div class="line">289</div><div class="line">290</div><div class="line">291</div><div class="line">292</div><div class="line">293</div><div class="line">294</div><div class="line">295</div><div class="line">296</div><div class="line">297</div><div class="line">298</div><div class="line">299</div><div class="line">300</div><div class="line">301</div><div class="line">302</div><div class="line">303</div><div class="line">304</div><div class="line">305</div><div class="line">306</div><div class="line">307</div><div class="line">308</div><div class="line">309</div><div class="line">310</div><div class="line">311</div><div class="line">312</div><div class="line">313</div><div class="line">314</div><div class="line">315</div><div class="line">316</div><div class="line">317</div><div class="line">318</div><div class="line">319</div><div class="line">320</div><div class="line">321</div><div class="line">322</div><div class="line">323</div><div class="line">324</div><div class="line">325</div><div class="line">326</div><div class="line">327</div><div class="line">328</div><div class="line">329</div><div class="line">330</div><div class="line">331</div><div class="line">332</div><div class="line">333</div><div class="line">334</div><div class="line">335</div><div class="line">336</div><div class="line">337</div><div class="line">338</div><div class="line">339</div><div class="line">340</div><div class="line">341</div><div class="line">342</div><div class="line">343</div><div class="line">344</div><div class="line">345</div><div class="line">346</div><div class="line">347</div><div class="line">348</div><div class="line">349</div><div class="line">350</div><div class="line">351</div><div class="line">352</div><div class="line">353</div><div class="line">354</div><div class="line">355</div><div class="line">356</div><div class="line">357</div><div class="line">358</div><div class="line">359</div><div class="line">360</div><div class="line">361</div><div class="line">362</div><div class="line">363</div><div class="line">364</div><div class="line">365</div><div class="line">366</div><div class="line">367</div><div class="line">368</div><div class="line">369</div><div class="line">370</div><div class="line">371</div><div class="line">372</div><div class="line">373</div><div class="line">374</div></pre></td><td class="code"><pre><div class="line">一、</div><div class="line">DataGridView 取得或者修改当前单元格的内容: </div><div class="line">当前单元格指的是 DataGridView 焦点所在的单元格,它可以通过 DataGridView 对象的 CurrentCell 属性取得。如果当前单元格不存在的时候,返回Nothing(C#是null) </div><div class="line">// 取得当前单元格内容 </div><div class="line">Console.WriteLine(DataGridView1.CurrentCell.Value); </div><div class="line">// 取得当前单元格的列 Index </div><div class="line">Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex); </div><div class="line">// 取得当前单元格的行 Index </div><div class="line">Console.WriteLine(DataGridView1.CurrentCell.RowIndex); </div><div class="line">另外,使用 DataGridView.CurrentCellAddress 属性(而不是直接访问单元格)来确定单元格所在的行:DataGridView.CurrentCellAddress.Y 和列: DataGridView.CurrentCellAddress.X 。这对于避免取消共享行的共享非常有用。 </div><div class="line">当前的单元格可以通过设定 DataGridView 对象的 CurrentCell 来改变。可以通过 CurrentCell 来设定 </div><div class="line">DataGridView 的激活单元格。将 CurrentCell 设为 Nothing(null) 可以取消激活的单元格。 </div><div class="line">// 设定 (0, 0) 为当前单元格 </div><div class="line">DataGridView1.CurrentCell = DataGridView1[0, 0]; </div><div class="line">在整行选中模式开启时,你也可以通过 CurrentCell 来设定选定行。 </div><div class="line">/**////</div><div class="line"></div><div class="line">/// 向下遍历 </div><div class="line">///</div><div class="line"></div><div class="line">/// </div><div class="line">/// </div><div class="line">private void button4_Click(object sender, EventArgs e) </div><div class="line">...{ </div><div class="line">int row = this.dataGridView1.CurrentRow.Index + 1; </div><div class="line">if (row > this.dataGridView1.RowCount - 1) </div><div class="line">row = 0; </div><div class="line">this.dataGridView1.CurrentCell = this.dataGridView1[0, row]; </div><div class="line">} </div><div class="line"></div><div class="line">/**////</div><div class="line"></div><div class="line">/// 向上遍历 </div><div class="line">///</div><div class="line"></div><div class="line">/// </div><div class="line">/// </div><div class="line">private void button5_Click(object sender, EventArgs e) </div><div class="line">...{ </div><div class="line">int row = this.dataGridView1.CurrentRow.Index - 1; </div><div class="line">if (row < 0) </div><div class="line">row = this.dataGridView1.RowCount - 1; </div><div class="line">this.dataGridView1.CurrentCell = this.dataGridView1[0, row]; </div><div class="line">} </div><div class="line">* 注意: this.dataGridView 的索引器的参数是: columnIndex, rowIndex 或是 columnName, rowIndex </div><div class="line">这与习惯不同。 </div><div class="line">② DataGridView 设定单元格只读: </div><div class="line">1) 使用 ReadOnly 属性 </div><div class="line">? 如果希望,DataGridView 内所有单元格都不可编辑, 那么只要: </div><div class="line">[C#] </div><div class="line">// 设置 DataGridView1 为只读 </div><div class="line">DataGridView1.ReadOnly = true; </div><div class="line">此时,用户的新增行操作和删除行操作也被屏蔽了。 </div><div class="line">? 如果希望,DataGridView 内某个单元格不可编辑, 那么只要: </div><div class="line">[C#] </div><div class="line">// 设置 DataGridView1 的第2列整列单元格为只读 </div><div class="line">DataGridView1.Columns[1].ReadOnly = true; </div><div class="line">// 设置 DataGridView1 的第3行整行单元格为只读 </div><div class="line">DataGridView1.Rows[2].ReadOnly = true; </div><div class="line">// 设置 DataGridView1 的[0,0]单元格为只读 </div><div class="line">DataGridView1[0, 0].ReadOnly = true; </div><div class="line">2) 使用 EditMode 属性 </div><div class="line">DataGridView.EditMode 属性被设置为 DataGridViewEditMode.EditProgrammatically 时,用户就不能手动编辑单元格的内容了。但是可以通过程序,调用 DataGridView.BeginEdit 方法,使单元格进入编辑模式进行编辑。 </div><div class="line">[C#] </div><div class="line">DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically; </div><div class="line">3) 根据条件设定单元格的不可编辑状态 </div><div class="line">当一个一个的通过单元格坐标设定单元格 ReadOnly 属性的方法太麻烦的时候,你可以通过 CellBeginEdit 事件来取消单元格的编辑。 </div><div class="line">[C#] </div><div class="line">// CellBeginEdit 事件处理方法 </div><div class="line">private void DataGridView1_CellBeginEdit(object sender, </div><div class="line">DataGridViewCellCancelEventArgs e) </div><div class="line">{ </div><div class="line">DataGridView dgv = (DataGridView)sender; </div><div class="line">//是否可以进行编辑的条件检查 </div><div class="line">if (dgv.Columns[e.ColumnIndex].Name == "Column1" && </div><div class="line">!(bool)dgv["Column2", e.RowIndex].Value) </div><div class="line">{ </div><div class="line">// 取消编辑 </div><div class="line">e.Cancel = true; </div><div class="line">} </div><div class="line">}</div><div class="line">二、</div><div class="line">DataGridView 不显示最下面的新行:</div><div class="line">通常 DataGridView 的最下面一行是用户新追加的行(行头显示 * )。如果不想让用户新追加行即不想显示该新行,可以将 DataGridView 对象的 AllowUserToAddRows 属性设置为 False。</div><div class="line">[C#]</div><div class="line">// 设置用户不能手动给 DataGridView1 添加新行</div><div class="line">DataGridView1.AllowUserToAddRows = false;</div><div class="line">但是,可以通过程序: DataGridViewRowCollection.Add 为 DataGridView 追加新行。</div><div class="line">补足: 如果 DataGridView 的 DataSource 绑定的是 DataView, 还可以通过设置 DataView.AllowAdd</div><div class="line">属性为 False 来达到同样的效果。</div><div class="line">④ DataGridView 判断新增行:</div><div class="line">DataGridView的AllowUserToAddRows属性为True时也就是允许用户追加新行的场合下,DataGridView的最后一行就是新追加的行(*行)。使用 DataGridViewRow.IsNewRow 属性可以判断哪一行是新追加的行。另外,通过DataGridView.NewRowIndex 可以获取新行的行序列号。在没有新行的时候,NewRowIndex = -1。 </div><div class="line">⑤ DataGridView 行的用户删除操作的自定义:</div><div class="line">1) 无条件的限制行删除操作。</div><div class="line">默认时,DataGridView 是允许用户进行行的删除操作的。如果设置 DataGridView对象的AllowUserToDeleteRows属性为 False 时, 用户的行删除操作就被禁止了。</div><div class="line">[C#]</div><div class="line">// 禁止DataGridView1的行删除操作。</div><div class="line">DataGridView1.AllowUserToDeleteRows = false;</div><div class="line">但是,通过 DataGridViewRowCollection.Remove 还是可以进行行的删除。</div><div class="line">补足: 如果 DataGridView 绑定的是 DataView 的话,通过 DataView.AllowDelete 也可以控制行的删除。</div><div class="line">2) 行删除时的条件判断处理。</div><div class="line">用户在删除行的时候,将会引发 DataGridView.UserDeletingRow 事件。 在这个事件里,可以判断条件并取消删除操作。</div><div class="line">[C#]</div><div class="line">// DataGridView1 的 UserDeletingRow 事件</div><div class="line">private void DataGridView1_UserDeletingRow(</div><div class="line">object sender, DataGridViewRowCancelEventArgs e)</div><div class="line">{</div><div class="line">// 删除前的用户确认。</div><div class="line">if (MessageBox.Show("确认要删除该行数据吗?", "删除确认",</div><div class="line">MessageBoxButtons.OKCancel,</div><div class="line">MessageBoxIcon.Question) != DialogResult.OK)</div><div class="line">{</div><div class="line">// 如果不是 OK,则取消。</div><div class="line">e.Cancel = true;</div><div class="line">}</div><div class="line">}</div><div class="line">⑥ DataGridView 行、列的隐藏和删除:</div><div class="line">1) 行、列的隐藏</div><div class="line">[C#]</div><div class="line">// DataGridView1的第一列隐藏</div><div class="line">DataGridView1.Columns[0].Visible = false;</div><div class="line">// DataGridView1的第一行隐藏</div><div class="line">DataGridView1.Rows[0].Visible = false;</div><div class="line">2) 行头、列头的隐藏</div><div class="line">[C#]</div><div class="line">// 列头隐藏</div><div class="line">DataGridView1.ColumnHeadersVisible = false;</div><div class="line">// 行头隐藏</div><div class="line">DataGridView1.RowHeadersVisible = false;</div><div class="line">3) 行和列的删除 </div><div class="line">[C#] </div><div class="line">' 删除名为"Column1"的列</div><div class="line">DataGridView1.Columns.Remove("Column1");</div><div class="line">' 删除第一列 </div><div class="line">DataGridView1.Columns.RemoveAt(0);</div><div class="line">' 删除第一行 </div><div class="line">DataGridView1.Rows.RemoveAt(0); </div><div class="line">4) 删除选中行</div><div class="line">[C#] </div><div class="line">foreach (DataGridViewRow r in DataGridView1.SelectedRows)</div><div class="line">{</div><div class="line">if (!r.IsNewRow)</div><div class="line">{</div><div class="line">DataGridView1.Rows.Remove(r);</div><div class="line">}</div><div class="line">}</div><div class="line">⑦ DataGridView 禁止列或者行的Resize:</div><div class="line">1) 禁止所有的列或者行的Resize</div><div class="line">[C#]</div><div class="line">// 禁止用户改变DataGridView1的所有列的列宽</div><div class="line">DataGridView1.AllowUserToResizeColumns = false;</div><div class="line">//禁止用户改变DataGridView1の所有行的行高</div><div class="line">DataGridView1.AllowUserToResizeRows = false;</div><div class="line">但是可以通过 DataGridViewColumn.Width 或者 DataGridViewRow.Height 属性设定列宽和行高。</div><div class="line">2) 禁止指定行或者列的Resize</div><div class="line">[C#]</div><div class="line">// 禁止用户改变DataGridView1的第一列的列宽</div><div class="line">DataGridView1.Columns[0].Resizable = DataGridViewTriState.False;</div><div class="line">// 禁止用户改变DataGridView1的第一列的行宽</div><div class="line">DataGridView1.Rows[0].Resizable = DataGridViewTriState.False;</div><div class="line">? 关于 NoSet</div><div class="line">当 Resizable 属性设为 DataGridViewTriState.NotSet 时, 实际上会默认以 DataGridView 的 AllowUserToResizeColumns 和 AllowUserToResizeRows 的属性值进行设定。比如: DataGridView.AllowUserToResizeColumns = False 且 Resizable 是 NoSet 设定时,Resizable = False 。</div><div class="line">判断 Resizable 是否是继承设定了 DataGridView 的 AllowUserToResizeColumns 和 AllowUserToResizeRows 的属性值, 可以根据 State 属性判断。如果 State 属性含有 ResizableSet,那么说明没有继承设定。</div><div class="line">3) 列宽和行高的最小值的设定</div><div class="line">[C#]</div><div class="line">// 第一列的最小列宽设定为 100 </div><div class="line">DataGridView1.Columns[0].MinimumWidth = 100;</div><div class="line">// 第一行的最小行高设定为 50</div><div class="line">DataGridView1.Rows[0].MinimumHeight = 50;</div><div class="line">4) 禁止用户改变行头的宽度以及列头的高度</div><div class="line">[C#]</div><div class="line">// 禁止用户改变列头的高度</div><div class="line">DataGridView1.ColumnHeadersHeightSizeMode =</div><div class="line">DataGridViewColumnHeadersHeightSizeMode.DisableResizing;</div><div class="line">// 禁止用户改变行头的宽度</div><div class="line">DataGridView1.RowHeadersWidthSizeMode =</div><div class="line">DataGridViewRowHeadersWidthSizeMode.EnableResizing;</div><div class="line"></div><div class="line">三、</div><div class="line">⑨ DataGridView 冻结列或行 </div><div class="line">1) 列冻结</div><div class="line">DataGridViewColumn.Frozen 属性为 True 时, 该列左侧的所有列被固定,横向滚动时固定列不随滚动条滚动而左右移动。这对于重要列固定显示很有用。 </div><div class="line">[C#]</div><div class="line">// DataGridView1的左侧2列固定</div><div class="line">DataGridView1.Columns[1].Frozen = true;</div><div class="line">但是,DataGridView.AllowUserToOrderColumns = True 时,固定列不能移动到非固定列,反之亦然。</div><div class="line">2) 行冻结</div><div class="line">DataGridViewRow.Frozen 属性为 True 时, 该行上面的所有行被固定, 纵向滚动时固定行不随滚动条滚动而上下移动。</div><div class="line">[C#]</div><div class="line">// DataGridView1 的上3行固定</div><div class="line">DataGridView1.Rows[2].Frozen = true;</div><div class="line">⑩ DataGridView 列顺序的调整</div><div class="line">设定 DataGridView 的 AllowUserToOrderColumns 为 True 的时候, 用户可以自由调整列的顺序。</div><div class="line">当用户改变列的顺序的时候,其本身的 Index 不会改变,但是 DisplayIndex 改变了。你也可以通过程序改变 DisplayIndex 来改变列的顺序。列顺序发生改变时会引发 ColumnDisplayIndexChanged 事件:</div><div class="line">[C#]</div><div class="line">// DataGridView1的ColumnDisplayIndexChanged事件处理方法</div><div class="line">private void DataGridView1_ColumnDisplayIndexChanged(object sender,</div><div class="line">DataGridViewColumnEventArgs e)</div><div class="line">{</div><div class="line">Console.WriteLine("{0} 的位置改变到 {1} ",</div><div class="line">e.Column.Name, e.Column.DisplayIndex);</div><div class="line">}</div><div class="line">? DataGridView 行头列头的单元格</div><div class="line">[C#]</div><div class="line">// 改变DataGridView1的第一列列头内容</div><div class="line">DataGridView1.Columns[0].HeaderCell.Value = "第一列";</div><div class="line">// 改变DataGridView1的第一行行头内容</div><div class="line">DataGridView1.Rows[0].HeaderCell.Value = "第一行";</div><div class="line">// 改变DataGridView1的左上头部单元内容</div><div class="line">DataGridView1.TopLeftHeaderCell.Value = "左上";</div><div class="line">另外你也可以通过 HeaderText 来改变他们的内容。</div><div class="line">[C#]</div><div class="line">// 改变DataGridView1的第一列列头内容</div><div class="line">DataGridView1.Columns[0].HeaderText = "第一列";</div><div class="line">? DataGridView 剪切板的操作</div><div class="line">DataGridView.ClipboardCopyMode 属性被设定为 DataGridViewClipboardCopyMode.Disable 以外的情况时,「Ctrl + C」按下的时候,被选择的单元格的内容会拷贝到系统剪切板内。格式有: Text, UnicodeText,Html, CommaSeparatedValue。可以直接粘贴到 Excel 内。</div><div class="line">ClipboardCopyMode 还可以设定 Header部分是否拷贝: EnableAlwaysIncludeHeaderText 拷贝Header部分、EnableWithoutHeaderText 则不拷贝。默认是 EnableWithAutoHeaderText , Header 如果选择了的话,就拷贝。</div><div class="line">1) 编程方式实现剪切板的拷贝</div><div class="line">Clipboard.SetDataObject(DataGridView1.GetClipboardContent()) </div><div class="line">2) DataGridView 的数据粘贴</div><div class="line">实现剪切板的拷贝比较容易,但是实现 DataGridView 的直接粘贴就比较难了。「Ctrl + V」按下进行粘贴时,DataGridView 没有提供方法,只能自己实现。</div><div class="line">以下,是粘贴时简单的事例代码,将拷贝数据粘贴到以选择单元格开始的区域内。</div><div class="line">[C#]</div><div class="line">//当前单元格是否选择的判断</div><div class="line">if (DataGridView1.CurrentCell == null)</div><div class="line">return;</div><div class="line">int insertRowIndex = DataGridView1.CurrentCell.RowIndex;</div><div class="line">// 获取剪切板的内容,并按行分割</div><div class="line">string pasteText = Clipboard.GetText();</div><div class="line">if (string.IsNullOrEmpty(pasteText))</div><div class="line">return;</div><div class="line">pasteText = pasteText.Replace(" ", " ");</div><div class="line">pasteText = pasteText.Replace(' ', ' ');</div><div class="line">pasteText.TrimEnd(new char[] { ' ' });</div><div class="line">string[] lines = pasteText.Split(' ');</div><div class="line">bool isHeader = true;</div><div class="line">foreach (string line in lines)</div><div class="line">{</div><div class="line">// 是否是列头</div><div class="line">if (isHeader)</div><div class="line">{</div><div class="line">isHeader = false;</div><div class="line">continue;</div><div class="line">}</div><div class="line">// 按 Tab 分割数据</div><div class="line">string[] vals = line.Split(' ');</div><div class="line">// 判断列数是否统一</div><div class="line">if (vals.Length - 1 != DataGridView1.ColumnCount)</div><div class="line">throw new ApplicationException("粘贴的列数不正确。");</div><div class="line">DataGridViewRow row = DataGridView1.Rows[insertRowIndex];</div><div class="line">// 行头设定</div><div class="line">row.HeaderCell.Value = vals[0];</div><div class="line">// 单元格内容设定</div><div class="line">for (int i = 0; i < row.Cells.Count; i++)</div><div class="line">{</div><div class="line">row.Cells.Value = vals[i + 1];</div><div class="line">}</div><div class="line">// DataGridView的行索引+1</div><div class="line">insertRowIndex++;</div><div class="line">}</div><div class="line">? DataGridView 单元格的ToolTip的设置</div><div class="line">DataGridView.ShowCellToolTips = True 的情况下, 单元格的 ToolTip 可以表示出来。对于单元格窄小,无法完全显示的单元格, ToolTip 可以显示必要的信息。</div><div class="line">1) 设定单元格的ToolTip内容</div><div class="line">[C#]</div><div class="line">// 设定单元格的ToolTip内容</div><div class="line">DataGridView1[0, 0].ToolTipText = "该单元格的内容不能修改";</div><div class="line">// 设定列头的单元格的ToolTip内容</div><div class="line">DataGridView1.Columns[0].ToolTipText = "该列只能输入数字";</div><div class="line">// 设定行头的单元格的ToolTip内容</div><div class="line">DataGridView1.Rows[0].HeaderCell.ToolTipText = "该行单元格内容不能修改";</div><div class="line">2) CellToolTipTextNeeded 事件</div><div class="line">在批量的单元格的 ToolTip 设定的时候,一个一个指定那么设定的效率比较低, 这时候可以利用 CellToolTipTextNeeded 事件。当单元格的 ToolTipText 变化的时候也会引发该事件。但是,当DataGridView的DataSource被指定且VirualMode=True的时候,该事件不会被引发。</div><div class="line">[C#]</div><div class="line">// CellToolTipTextNeeded事件处理方法</div><div class="line">private void DataGridView1_CellToolTipTextNeeded(object sender,</div><div class="line">DataGridViewCellToolTipTextNeededEventArgs e)</div><div class="line">{</div><div class="line">e.ToolTipText = e.ColumnIndex.ToString() + ", " + e.RowIndex.ToString();</div><div class="line">}</div><div class="line">? DataGridView 的右键菜单(ContextMenuStrip) </div><div class="line">DataGridView, DataGridViewColumn, DataGridViewRow, DataGridViewCell 有 ContextMenuStrip 属性。可以通过设定 ContextMenuStrip 对象来控制 DataGridView 的右键菜单的显示。 DataGridViewColumn 的 ContextMenuStrip 属性设定了 除了列头以外的单元格的右键菜单。 DataGridViewRow 的 ContextMenuStrip 属性设定了除了行头以外的单元格的右键菜单。DataGridViewCell 的 ContextMenuStrip 属性设定了指定单元格的右键菜单。 </div><div class="line">[C#]</div><div class="line">// DataGridView 的 ContextMenuStrip 设定</div><div class="line">DataGridView1.ContextMenuStrip = this.ContextMenuStrip1;</div><div class="line">// 列的 ContextMenuStrip 设定</div><div class="line">DataGridView1.Columns[0].ContextMenuStrip = this.ContextMenuStrip2;</div><div class="line">// 列头的 ContextMenuStrip 设定</div><div class="line">DataGridView1.Columns[0].HeaderCell.ContextMenuStrip = this.ContextMenuStrip2;</div><div class="line">// 行的 ContextMenuStrip 设定</div><div class="line">DataGridView1.Rows[0].ContextMenuStrip = this.ContextMenuStrip3;</div><div class="line">// 单元格的 ContextMenuStrip 设定</div><div class="line">DataGridView1[0, 0].ContextMenuStrip = this.ContextMenuStrip4;</div><div class="line">对于单元格上的右键菜单的设定,优先顺序是: Cell > Row > Column > DataGridView</div><div class="line">? CellContextMenuStripNeeded、RowContextMenuStripNeeded 事件</div><div class="line">利用 CellContextMenuStripNeeded 事件可以设定单元格的右键菜单,尤其但需要右键菜单根据单元格值的变化而变化的时候。比起使用循环遍历,使用该事件来设定右键菜单的效率更高。但是,在DataGridView使用了DataSource绑定而且是VirtualMode的时候,该事件将不被引发。</div><div class="line">[C#]</div><div class="line">// CellContextMenuStripNeeded事件处理方法</div><div class="line">private void DataGridView1_CellContextMenuStripNeeded(object sender,</div><div class="line">DataGridViewCellContextMenuStripNeededEventArgs e)</div><div class="line">{</div><div class="line">DataGridView dgv = (DataGridView)sender;</div><div class="line">if (e.RowIndex < 0)</div><div class="line">{</div><div class="line">// 列头的ContextMenuStrip设定</div><div class="line">e.ContextMenuStrip = this.ContextMenuStrip1;</div><div class="line">}</div><div class="line">else if (e.ColumnIndex < 0)</div><div class="line">{</div><div class="line">// 行头的ContextMenuStrip设定</div><div class="line">e.ContextMenuStrip = this.ContextMenuStrip2;</div><div class="line">}</div><div class="line">else if (dgv[e.ColumnIndex, e.RowIndex].Value is int)</div><div class="line">{</div><div class="line">// 如果单元格值是整数时</div><div class="line">e.ContextMenuStrip = this.ContextMenuStrip3;</div><div class="line">}</div><div class="line">}</div><div class="line">同样,可以通过 RowContextMenuStripNeeded 事件来设定行的右键菜单。 [C#]</div><div class="line">// RowContextMenuStripNeeded事件处理方法</div><div class="line">private void DataGridView1_RowContextMenuStripNeeded(object sender,</div><div class="line">DataGridViewRowContextMenuStripNeededEventArgs e)</div><div class="line">{</div><div class="line">DataGridView dgv = (DataGridView)sender;</div><div class="line">// 当"Column1"列是Bool型且为True时、设定其的ContextMenuStrip</div><div class="line">object boolVal = dgv["Column1", e.RowIndex].Value;</div><div class="line">Console.WriteLine(boolVal);</div><div class="line">if (boolVal is bool && (bool)boolVal)</div><div class="line">{</div><div class="line">e.ContextMenuStrip = this.ContextMenuStrip1;</div><div class="line">}</div><div class="line">}</div><div class="line">CellContextMenuStripNeeded 事件处理方法的参数中、「e.ColumnIndex=-1」表示行头、「e.RowIndex=-1」表示列头。RowContextMenuStripNeeded则不存在「e.RowIndex=-1」的情况。</div><div class="line">? DataGridView 的单元格的边框、 网格线样式的设定 </div><div class="line">1) DataGridView 的边框线样式的设定</div><div class="line">DataGridView 的边框线的样式是通过 DataGridView.BorderStyle 属性来设定的。 BorderStyle 属性设定值是一个</div><div class="line">BorderStyle 枚举: FixedSingle(单线,默认)、Fixed3D、None。</div><div class="line">2) 单元格的边框线样式的设定</div><div class="line">单元格的边框线的样式是通过 DataGridView.CellBorderStyle 属性来设定的。 CellBorderStyle 属性设定值是</div><div class="line">DataGridViewCellBorderStyle 枚举。(详细参见 MSDN)</div><div class="line">另外,通过 DataGridView.ColumnHeadersBorderStyle 和 RowHeadersBorderStyle 属性可以修改 DataGridView 的头部的单元格边框线样式。属性设定值是 DataGridViewHeaderBorderStyle 枚举。(详细参见 MSDN)</div><div class="line">3) 单元格的边框颜色的设定</div><div class="line">单元格的边框线的颜色可以通过 DataGridView.GridColor 属性来设定的。默认是 ControlDarkDark 。但是只有在 CellBorderStyle 被设定为 Single、SingleHorizontal、SingleVertical 的条件下才能改变其边框线的颜色。同样,ColumnHeadersBorderStyle 以及 RowHeadersBorderStyle 只有在被设定为 Single 时,才能改变颜色。</div><div class="line">4) 单元格的上下左右的边框线式样的单独设定</div><div class="line">CellBorderStyle只能设定单元格全部边框线的式样。要单独改变单元格某一边边框式样的话,需要用到DataGridView.AdvancedCellBorderStyle属性。如示例:</div><div class="line">同样,设定行头单元格的属性是: AdvancedRowHeadersBorderStyle, 设定列头单元格属性是:AdvancedColumnHeadersBorderStyle。</div><div class="line">? DataGridView 单元格表示值的自定义</div><div class="line">通过CellFormatting事件,可以自定义单元格的表示值。(比如:值为Error的时候,单元格被设定为红色)</div><div class="line">下面的示例:将“Colmn1”列的值改为大写。</div><div class="line">[C#]</div><div class="line">//CellFormatting 事件处理方法</div><div class="line">private void DataGridView1_CellFormatting(object sender,</div><div class="line">DataGridViewCellFormattingEventArgs e)</div><div class="line">{</div><div class="line">DataGridView dgv = (DataGridView)sender;</div><div class="line">// 如果单元格是“Column1”列的单元格</div><div class="line">if (dgv.Columns[e.ColumnIndex].Name == "Column1" && e.Value is string)</div><div class="line">{</div><div class="line">// 将单元格值改为大写</div><div class="line">string str = e.Value.ToString();</div><div class="line">e.Value = str.ToUpper();</div><div class="line">// 应用该Format,Format完毕。</div><div class="line">e.FormattingApplied = true;</div><div class="line">}</div><div class="line">}</div><div class="line">CellFormatting事件的DataGridViewCellFormattingEventArgs对象的Value属性一开始保存着未被格式化的值。当Value属性被设定表示用的文本之后,把FormattingApplied属性做为True,告知DataGridView文本已经格式化完毕。如果不这样做的话,DataGridView会根据已经设定的Format,NullValue,DataSourceNullValue,FormatProvider属性会将Value属性会被重新格式化一遍。</div><div class="line">? DataGridView 用户输入时,单元格输入值的设定</div><div class="line">通过 DataGridView.CellParsing 事件可以设定用户输入的值。下面的示例:当输入英文文本内容的时候,立即被改变为大写。</div><div class="line">[C#]</div><div class="line">//CellParsing 事件处理方法</div><div class="line">private void DataGridView1_CellParsing(object sender,</div><div class="line">DataGridViewCellParsingEventArgs e)</div><div class="line">{</div><div class="line">DataGridView dgv = (DataGridView)sender;</div><div class="line">//单元格列为“Column1%2</div></pre></td></tr></table></figure>
<hr>
<blockquote>
<p>更多资料请加群获取</p>
</blockquote>
]]></content>
<tags>
<tag> C# </tag>
<tag> 控件 </tag>
<tag> WinForm </tag>
</tags>
</entry>
<entry>
<title><![CDATA[WinFprm中DataGridView控件的使用]]></title>
<url>/Home/WinFprm%E4%B8%ADDataGridView%E6%8E%A7%E4%BB%B6%E7%9A%84%E4%BD%BF%E7%94%A8.html</url>
<content type="html"><![CDATA[<p>##datagridview控件使用前言</p>
<p>由于最近使用winform来写程序,因为系统需要,使用到了datagridview控件,在网上查阅了大量的资料,最后可以整理为两种模式,一种较为简单,但是如果多次使用到这个控件会导致出现大量重复代码,不是最优化的效果,但是不利于后期修改,这不是我们想要的结果,第二种较为繁琐,封装成一个类,然后引用封装的这个类就可以了,这样提高了代码利用率!</p>
<blockquote>
<ul>
<li><p><strong>第一种:</strong> 获取数据库配置信息,new一个链接,做一个查询,返回生成一个table,然后再填充到控件。 </p>
</li>
<li><p><strong>第二种:</strong> 将第一种封装成一个类,然后里面的写成变量,传递参数,然后调用就可以,方便快捷省事。</p>
</li>
</ul>
</blockquote>
<h3 id="第一种"><a href="#第一种" class="headerlink" title="第一种"></a>第一种</h3><p>//连接数据库读取数据,为DataGridView赋值。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line"> String strConn = "server= .\XWPC_DATABASE;uid=数据库用户名;pwd=数据库密码;database=数据库名";</div><div class="line">SqlConnection conn = new SqlConnection(strConn);</div><div class="line">String sqlId = "select * from [USER] ";</div><div class="line">conn.Open();</div><div class="line">SqlCommand cmd = new SqlCommand(sqlId, conn);</div><div class="line">SqlDataAdapter da = new SqlDataAdapter(cmd);</div><div class="line"></div><div class="line">DataSet ds = new DataSet();</div><div class="line">da.Fill(ds, "USER");</div><div class="line"></div><div class="line">DataGridView.DataSource = ds;</div><div class="line">DataGridView.DataMember = "USER";</div><div class="line"></div><div class="line">conn.Close();</div></pre></td></tr></table></figure></p>
<h3 id="第二种"><a href="#第二种" class="headerlink" title="第二种"></a>第二种</h3><blockquote>
<p>将第一种的语句封装到一个类,调用</p>
</blockquote>
<h4 id="举例子"><a href="#举例子" class="headerlink" title="举例子"></a>举例子</h4><p>例如封装到sqlhelper类中<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div></pre></td><td class="code"><pre><div class="line">public static DataSet ExecuteDataSet(string sql,SqlParameter[] parameters,String cls)</div><div class="line"> {</div><div class="line"> using (SqlConnection conn = new SqlConnection(dbConnStr))</div><div class="line"> {</div><div class="line"> conn.Open();</div><div class="line"> using (SqlCommand cmd = conn.CreateCommand())</div><div class="line"> {</div><div class="line"> cmd.CommandText = sql;</div><div class="line"> if (null != parameters)</div><div class="line"> {</div><div class="line"> cmd.Parameters.AddRange(parameters);</div><div class="line"> }</div><div class="line"></div><div class="line"> SqlDataAdapter adapter = new SqlDataAdapter(cmd);</div><div class="line"> DataSet dataSet = new DataSet();</div><div class="line"> adapter.Fill(dataSet, cls);</div><div class="line"> // return dataSet.Tables[0];</div><div class="line"> return dataSet;</div><div class="line"> </div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> }</div><div class="line">``` </div><div class="line">引用</div><div class="line">```c#</div><div class="line">PeopleModel peopleModel = new PeopleModel();</div><div class="line">peopleModel.people_name=tbxname.Text.Trim();</div><div class="line">peopleModel.people_ruxue = tbxruxue.Text.Trim();</div><div class="line">peopleModel.people_xibie = tbxxibie.Text.Trim();</div><div class="line">peopleModel.people_zhuanye = tbxzhuanye.Text.Trim();</div><div class="line">peopleModel.people_qq = tbxqq.Text.Trim();</div><div class="line"></div><div class="line">PeopleDAL peopleDAL = new PeopleDAL();</div><div class="line">this.studentlist.DataSource = peopleDAL.findObjCount(peopleModel, "T_Class");</div><div class="line">his.studentlist.AutoGenerateColumns = false;//关闭自动增加的列</div><div class="line">this.studentlist.DataMember = "T_Class";</div></pre></td></tr></table></figure></p>
<h4 id="常用属性"><a href="#常用属性" class="headerlink" title="常用属性"></a>常用属性</h4><p>取得当前单元格内容<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Console.WriteLine(DataGridView1.CurrentCell.Value);</div></pre></td></tr></table></figure></p>
<p>取得当前单元格的列 Index<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex);</div></pre></td></tr></table></figure></p>
<p>取得当前单元格的行 Index<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Console.WriteLine(DataGridView1.CurrentCell.RowIndex);</div></pre></td></tr></table></figure></p>
<h2 id="其他属性"><a href="#其他属性" class="headerlink" title="其他属性"></a>其他属性</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div><div class="line">126</div><div class="line">127</div><div class="line">128</div><div class="line">129</div><div class="line">130</div><div class="line">131</div><div class="line">132</div><div class="line">133</div><div class="line">134</div><div class="line">135</div><div class="line">136</div><div class="line">137</div><div class="line">138</div><div class="line">139</div><div class="line">140</div><div class="line">141</div><div class="line">142</div><div class="line">143</div><div class="line">144</div><div class="line">145</div><div class="line">146</div><div class="line">147</div><div class="line">148</div><div class="line">149</div><div class="line">150</div><div class="line">151</div><div class="line">152</div><div class="line">153</div><div class="line">154</div><div class="line">155</div><div class="line">156</div><div class="line">157</div><div class="line">158</div><div class="line">159</div><div class="line">160</div><div class="line">161</div><div class="line">162</div><div class="line">163</div><div class="line">164</div><div class="line">165</div><div class="line">166</div><div class="line">167</div><div class="line">168</div><div class="line">169</div><div class="line">170</div><div class="line">171</div><div class="line">172</div><div class="line">173</div><div class="line">174</div><div class="line">175</div><div class="line">176</div><div class="line">177</div><div class="line">178</div><div class="line">179</div><div class="line">180</div><div class="line">181</div><div class="line">182</div><div class="line">183</div><div class="line">184</div><div class="line">185</div><div class="line">186</div><div class="line">187</div><div class="line">188</div><div class="line">189</div><div class="line">190</div><div class="line">191</div><div class="line">192</div><div class="line">193</div><div class="line">194</div><div class="line">195</div><div class="line">196</div><div class="line">197</div><div class="line">198</div><div class="line">199</div><div class="line">200</div><div class="line">201</div><div class="line">202</div><div class="line">203</div><div class="line">204</div><div class="line">205</div><div class="line">206</div><div class="line">207</div><div class="line">208</div><div class="line">209</div><div class="line">210</div><div class="line">211</div><div class="line">212</div><div class="line">213</div><div class="line">214</div><div class="line">215</div><div class="line">216</div><div class="line">217</div><div class="line">218</div><div class="line">219</div><div class="line">220</div><div class="line">221</div><div class="line">222</div><div class="line">223</div><div class="line">224</div><div class="line">225</div><div class="line">226</div><div class="line">227</div><div class="line">228</div><div class="line">229</div><div class="line">230</div><div class="line">231</div><div class="line">232</div><div class="line">233</div><div class="line">234</div><div class="line">235</div><div class="line">236</div><div class="line">237</div><div class="line">238</div><div class="line">239</div><div class="line">240</div><div class="line">241</div><div class="line">242</div><div class="line">243</div><div class="line">244</div><div class="line">245</div><div class="line">246</div><div class="line">247</div><div class="line">248</div><div class="line">249</div><div class="line">250</div><div class="line">251</div><div class="line">252</div><div class="line">253</div><div class="line">254</div><div class="line">255</div><div class="line">256</div><div class="line">257</div><div class="line">258</div><div class="line">259</div><div class="line">260</div><div class="line">261</div><div class="line">262</div><div class="line">263</div><div class="line">264</div><div class="line">265</div><div class="line">266</div><div class="line">267</div><div class="line">268</div><div class="line">269</div><div class="line">270</div><div class="line">271</div><div class="line">272</div><div class="line">273</div><div class="line">274</div><div class="line">275</div><div class="line">276</div><div class="line">277</div><div class="line">278</div><div class="line">279</div><div class="line">280</div><div class="line">281</div><div class="line">282</div><div class="line">283</div><div class="line">284</div><div class="line">285</div><div class="line">286</div><div class="line">287</div><div class="line">288</div><div class="line">289</div><div class="line">290</div><div class="line">291</div><div class="line">292</div><div class="line">293</div><div class="line">294</div><div class="line">295</div><div class="line">296</div><div class="line">297</div><div class="line">298</div><div class="line">299</div><div class="line">300</div><div class="line">301</div><div class="line">302</div><div class="line">303</div><div class="line">304</div><div class="line">305</div><div class="line">306</div><div class="line">307</div><div class="line">308</div><div class="line">309</div><div class="line">310</div><div class="line">311</div><div class="line">312</div><div class="line">313</div><div class="line">314</div><div class="line">315</div><div class="line">316</div><div class="line">317</div><div class="line">318</div><div class="line">319</div><div class="line">320</div><div class="line">321</div><div class="line">322</div><div class="line">323</div><div class="line">324</div><div class="line">325</div><div class="line">326</div><div class="line">327</div><div class="line">328</div><div class="line">329</div><div class="line">330</div><div class="line">331</div><div class="line">332</div><div class="line">333</div><div class="line">334</div><div class="line">335</div><div class="line">336</div><div class="line">337</div><div class="line">338</div><div class="line">339</div><div class="line">340</div><div class="line">341</div><div class="line">342</div><div class="line">343</div><div class="line">344</div><div class="line">345</div><div class="line">346</div><div class="line">347</div><div class="line">348</div><div class="line">349</div><div class="line">350</div><div class="line">351</div><div class="line">352</div><div class="line">353</div><div class="line">354</div><div class="line">355</div><div class="line">356</div><div class="line">357</div><div class="line">358</div><div class="line">359</div><div class="line">360</div><div class="line">361</div><div class="line">362</div><div class="line">363</div><div class="line">364</div><div class="line">365</div><div class="line">366</div><div class="line">367</div><div class="line">368</div><div class="line">369</div><div class="line">370</div><div class="line">371</div><div class="line">372</div><div class="line">373</div><div class="line">374</div></pre></td><td class="code"><pre><div class="line">一、</div><div class="line">DataGridView 取得或者修改当前单元格的内容: </div><div class="line">当前单元格指的是 DataGridView 焦点所在的单元格,它可以通过 DataGridView 对象的 CurrentCell 属性取得。如果当前单元格不存在的时候,返回Nothing(C#是null) </div><div class="line">// 取得当前单元格内容 </div><div class="line">Console.WriteLine(DataGridView1.CurrentCell.Value); </div><div class="line">// 取得当前单元格的列 Index </div><div class="line">Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex); </div><div class="line">// 取得当前单元格的行 Index </div><div class="line">Console.WriteLine(DataGridView1.CurrentCell.RowIndex); </div><div class="line">另外,使用 DataGridView.CurrentCellAddress 属性(而不是直接访问单元格)来确定单元格所在的行:DataGridView.CurrentCellAddress.Y 和列: DataGridView.CurrentCellAddress.X 。这对于避免取消共享行的共享非常有用。 </div><div class="line">当前的单元格可以通过设定 DataGridView 对象的 CurrentCell 来改变。可以通过 CurrentCell 来设定 </div><div class="line">DataGridView 的激活单元格。将 CurrentCell 设为 Nothing(null) 可以取消激活的单元格。 </div><div class="line">// 设定 (0, 0) 为当前单元格 </div><div class="line">DataGridView1.CurrentCell = DataGridView1[0, 0]; </div><div class="line">在整行选中模式开启时,你也可以通过 CurrentCell 来设定选定行。 </div><div class="line">/**////</div><div class="line"></div><div class="line">/// 向下遍历 </div><div class="line">///</div><div class="line"></div><div class="line">/// </div><div class="line">/// </div><div class="line">private void button4_Click(object sender, EventArgs e) </div><div class="line">...{ </div><div class="line">int row = this.dataGridView1.CurrentRow.Index + 1; </div><div class="line">if (row > this.dataGridView1.RowCount - 1) </div><div class="line">row = 0; </div><div class="line">this.dataGridView1.CurrentCell = this.dataGridView1[0, row]; </div><div class="line">} </div><div class="line"></div><div class="line">/**////</div><div class="line"></div><div class="line">/// 向上遍历 </div><div class="line">///</div><div class="line"></div><div class="line">/// </div><div class="line">/// </div><div class="line">private void button5_Click(object sender, EventArgs e) </div><div class="line">...{ </div><div class="line">int row = this.dataGridView1.CurrentRow.Index - 1; </div><div class="line">if (row < 0) </div><div class="line">row = this.dataGridView1.RowCount - 1; </div><div class="line">this.dataGridView1.CurrentCell = this.dataGridView1[0, row]; </div><div class="line">} </div><div class="line">* 注意: this.dataGridView 的索引器的参数是: columnIndex, rowIndex 或是 columnName, rowIndex </div><div class="line">这与习惯不同。 </div><div class="line">② DataGridView 设定单元格只读: </div><div class="line">1) 使用 ReadOnly 属性 </div><div class="line">? 如果希望,DataGridView 内所有单元格都不可编辑, 那么只要: </div><div class="line">[C#] </div><div class="line">// 设置 DataGridView1 为只读 </div><div class="line">DataGridView1.ReadOnly = true; </div><div class="line">此时,用户的新增行操作和删除行操作也被屏蔽了。 </div><div class="line">? 如果希望,DataGridView 内某个单元格不可编辑, 那么只要: </div><div class="line">[C#] </div><div class="line">// 设置 DataGridView1 的第2列整列单元格为只读 </div><div class="line">DataGridView1.Columns[1].ReadOnly = true; </div><div class="line">// 设置 DataGridView1 的第3行整行单元格为只读 </div><div class="line">DataGridView1.Rows[2].ReadOnly = true; </div><div class="line">// 设置 DataGridView1 的[0,0]单元格为只读 </div><div class="line">DataGridView1[0, 0].ReadOnly = true; </div><div class="line">2) 使用 EditMode 属性 </div><div class="line">DataGridView.EditMode 属性被设置为 DataGridViewEditMode.EditProgrammatically 时,用户就不能手动编辑单元格的内容了。但是可以通过程序,调用 DataGridView.BeginEdit 方法,使单元格进入编辑模式进行编辑。 </div><div class="line">[C#] </div><div class="line">DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically; </div><div class="line">3) 根据条件设定单元格的不可编辑状态 </div><div class="line">当一个一个的通过单元格坐标设定单元格 ReadOnly 属性的方法太麻烦的时候,你可以通过 CellBeginEdit 事件来取消单元格的编辑。 </div><div class="line">[C#] </div><div class="line">// CellBeginEdit 事件处理方法 </div><div class="line">private void DataGridView1_CellBeginEdit(object sender, </div><div class="line">DataGridViewCellCancelEventArgs e) </div><div class="line">{ </div><div class="line">DataGridView dgv = (DataGridView)sender; </div><div class="line">//是否可以进行编辑的条件检查 </div><div class="line">if (dgv.Columns[e.ColumnIndex].Name == "Column1" && </div><div class="line">!(bool)dgv["Column2", e.RowIndex].Value) </div><div class="line">{ </div><div class="line">// 取消编辑 </div><div class="line">e.Cancel = true; </div><div class="line">} </div><div class="line">}</div><div class="line">二、</div><div class="line">DataGridView 不显示最下面的新行:</div><div class="line">通常 DataGridView 的最下面一行是用户新追加的行(行头显示 * )。如果不想让用户新追加行即不想显示该新行,可以将 DataGridView 对象的 AllowUserToAddRows 属性设置为 False。</div><div class="line">[C#]</div><div class="line">// 设置用户不能手动给 DataGridView1 添加新行</div><div class="line">DataGridView1.AllowUserToAddRows = false;</div><div class="line">但是,可以通过程序: DataGridViewRowCollection.Add 为 DataGridView 追加新行。</div><div class="line">补足: 如果 DataGridView 的 DataSource 绑定的是 DataView, 还可以通过设置 DataView.AllowAdd</div><div class="line">属性为 False 来达到同样的效果。</div><div class="line">④ DataGridView 判断新增行:</div><div class="line">DataGridView的AllowUserToAddRows属性为True时也就是允许用户追加新行的场合下,DataGridView的最后一行就是新追加的行(*行)。使用 DataGridViewRow.IsNewRow 属性可以判断哪一行是新追加的行。另外,通过DataGridView.NewRowIndex 可以获取新行的行序列号。在没有新行的时候,NewRowIndex = -1。 </div><div class="line">⑤ DataGridView 行的用户删除操作的自定义:</div><div class="line">1) 无条件的限制行删除操作。</div><div class="line">默认时,DataGridView 是允许用户进行行的删除操作的。如果设置 DataGridView对象的AllowUserToDeleteRows属性为 False 时, 用户的行删除操作就被禁止了。</div><div class="line">[C#]</div><div class="line">// 禁止DataGridView1的行删除操作。</div><div class="line">DataGridView1.AllowUserToDeleteRows = false;</div><div class="line">但是,通过 DataGridViewRowCollection.Remove 还是可以进行行的删除。</div><div class="line">补足: 如果 DataGridView 绑定的是 DataView 的话,通过 DataView.AllowDelete 也可以控制行的删除。</div><div class="line">2) 行删除时的条件判断处理。</div><div class="line">用户在删除行的时候,将会引发 DataGridView.UserDeletingRow 事件。 在这个事件里,可以判断条件并取消删除操作。</div><div class="line">[C#]</div><div class="line">// DataGridView1 的 UserDeletingRow 事件</div><div class="line">private void DataGridView1_UserDeletingRow(</div><div class="line">object sender, DataGridViewRowCancelEventArgs e)</div><div class="line">{</div><div class="line">// 删除前的用户确认。</div><div class="line">if (MessageBox.Show("确认要删除该行数据吗?", "删除确认",</div><div class="line">MessageBoxButtons.OKCancel,</div><div class="line">MessageBoxIcon.Question) != DialogResult.OK)</div><div class="line">{</div><div class="line">// 如果不是 OK,则取消。</div><div class="line">e.Cancel = true;</div><div class="line">}</div><div class="line">}</div><div class="line">⑥ DataGridView 行、列的隐藏和删除:</div><div class="line">1) 行、列的隐藏</div><div class="line">[C#]</div><div class="line">// DataGridView1的第一列隐藏</div><div class="line">DataGridView1.Columns[0].Visible = false;</div><div class="line">// DataGridView1的第一行隐藏</div><div class="line">DataGridView1.Rows[0].Visible = false;</div><div class="line">2) 行头、列头的隐藏</div><div class="line">[C#]</div><div class="line">// 列头隐藏</div><div class="line">DataGridView1.ColumnHeadersVisible = false;</div><div class="line">// 行头隐藏</div><div class="line">DataGridView1.RowHeadersVisible = false;</div><div class="line">3) 行和列的删除 </div><div class="line">[C#] </div><div class="line">' 删除名为"Column1"的列</div><div class="line">DataGridView1.Columns.Remove("Column1");</div><div class="line">' 删除第一列 </div><div class="line">DataGridView1.Columns.RemoveAt(0);</div><div class="line">' 删除第一行 </div><div class="line">DataGridView1.Rows.RemoveAt(0); </div><div class="line">4) 删除选中行</div><div class="line">[C#] </div><div class="line">foreach (DataGridViewRow r in DataGridView1.SelectedRows)</div><div class="line">{</div><div class="line">if (!r.IsNewRow)</div><div class="line">{</div><div class="line">DataGridView1.Rows.Remove(r);</div><div class="line">}</div><div class="line">}</div><div class="line">⑦ DataGridView 禁止列或者行的Resize:</div><div class="line">1) 禁止所有的列或者行的Resize</div><div class="line">[C#]</div><div class="line">// 禁止用户改变DataGridView1的所有列的列宽</div><div class="line">DataGridView1.AllowUserToResizeColumns = false;</div><div class="line">//禁止用户改变DataGridView1の所有行的行高</div><div class="line">DataGridView1.AllowUserToResizeRows = false;</div><div class="line">但是可以通过 DataGridViewColumn.Width 或者 DataGridViewRow.Height 属性设定列宽和行高。</div><div class="line">2) 禁止指定行或者列的Resize</div><div class="line">[C#]</div><div class="line">// 禁止用户改变DataGridView1的第一列的列宽</div><div class="line">DataGridView1.Columns[0].Resizable = DataGridViewTriState.False;</div><div class="line">// 禁止用户改变DataGridView1的第一列的行宽</div><div class="line">DataGridView1.Rows[0].Resizable = DataGridViewTriState.False;</div><div class="line">? 关于 NoSet</div><div class="line">当 Resizable 属性设为 DataGridViewTriState.NotSet 时, 实际上会默认以 DataGridView 的 AllowUserToResizeColumns 和 AllowUserToResizeRows 的属性值进行设定。比如: DataGridView.AllowUserToResizeColumns = False 且 Resizable 是 NoSet 设定时,Resizable = False 。</div><div class="line">判断 Resizable 是否是继承设定了 DataGridView 的 AllowUserToResizeColumns 和 AllowUserToResizeRows 的属性值, 可以根据 State 属性判断。如果 State 属性含有 ResizableSet,那么说明没有继承设定。</div><div class="line">3) 列宽和行高的最小值的设定</div><div class="line">[C#]</div><div class="line">// 第一列的最小列宽设定为 100 </div><div class="line">DataGridView1.Columns[0].MinimumWidth = 100;</div><div class="line">// 第一行的最小行高设定为 50</div><div class="line">DataGridView1.Rows[0].MinimumHeight = 50;</div><div class="line">4) 禁止用户改变行头的宽度以及列头的高度</div><div class="line">[C#]</div><div class="line">// 禁止用户改变列头的高度</div><div class="line">DataGridView1.ColumnHeadersHeightSizeMode =</div><div class="line">DataGridViewColumnHeadersHeightSizeMode.DisableResizing;</div><div class="line">// 禁止用户改变行头的宽度</div><div class="line">DataGridView1.RowHeadersWidthSizeMode =</div><div class="line">DataGridViewRowHeadersWidthSizeMode.EnableResizing;</div><div class="line"></div><div class="line">三、</div><div class="line">⑨ DataGridView 冻结列或行 </div><div class="line">1) 列冻结</div><div class="line">DataGridViewColumn.Frozen 属性为 True 时, 该列左侧的所有列被固定,横向滚动时固定列不随滚动条滚动而左右移动。这对于重要列固定显示很有用。 </div><div class="line">[C#]</div><div class="line">// DataGridView1的左侧2列固定</div><div class="line">DataGridView1.Columns[1].Frozen = true;</div><div class="line">但是,DataGridView.AllowUserToOrderColumns = True 时,固定列不能移动到非固定列,反之亦然。</div><div class="line">2) 行冻结</div><div class="line">DataGridViewRow.Frozen 属性为 True 时, 该行上面的所有行被固定, 纵向滚动时固定行不随滚动条滚动而上下移动。</div><div class="line">[C#]</div><div class="line">// DataGridView1 的上3行固定</div><div class="line">DataGridView1.Rows[2].Frozen = true;</div><div class="line">⑩ DataGridView 列顺序的调整</div><div class="line">设定 DataGridView 的 AllowUserToOrderColumns 为 True 的时候, 用户可以自由调整列的顺序。</div><div class="line">当用户改变列的顺序的时候,其本身的 Index 不会改变,但是 DisplayIndex 改变了。你也可以通过程序改变 DisplayIndex 来改变列的顺序。列顺序发生改变时会引发 ColumnDisplayIndexChanged 事件:</div><div class="line">[C#]</div><div class="line">// DataGridView1的ColumnDisplayIndexChanged事件处理方法</div><div class="line">private void DataGridView1_ColumnDisplayIndexChanged(object sender,</div><div class="line">DataGridViewColumnEventArgs e)</div><div class="line">{</div><div class="line">Console.WriteLine("{0} 的位置改变到 {1} ",</div><div class="line">e.Column.Name, e.Column.DisplayIndex);</div><div class="line">}</div><div class="line">? DataGridView 行头列头的单元格</div><div class="line">[C#]</div><div class="line">// 改变DataGridView1的第一列列头内容</div><div class="line">DataGridView1.Columns[0].HeaderCell.Value = "第一列";</div><div class="line">// 改变DataGridView1的第一行行头内容</div><div class="line">DataGridView1.Rows[0].HeaderCell.Value = "第一行";</div><div class="line">// 改变DataGridView1的左上头部单元内容</div><div class="line">DataGridView1.TopLeftHeaderCell.Value = "左上";</div><div class="line">另外你也可以通过 HeaderText 来改变他们的内容。</div><div class="line">[C#]</div><div class="line">// 改变DataGridView1的第一列列头内容</div><div class="line">DataGridView1.Columns[0].HeaderText = "第一列";</div><div class="line">? DataGridView 剪切板的操作</div><div class="line">DataGridView.ClipboardCopyMode 属性被设定为 DataGridViewClipboardCopyMode.Disable 以外的情况时,「Ctrl + C」按下的时候,被选择的单元格的内容会拷贝到系统剪切板内。格式有: Text, UnicodeText,Html, CommaSeparatedValue。可以直接粘贴到 Excel 内。</div><div class="line">ClipboardCopyMode 还可以设定 Header部分是否拷贝: EnableAlwaysIncludeHeaderText 拷贝Header部分、EnableWithoutHeaderText 则不拷贝。默认是 EnableWithAutoHeaderText , Header 如果选择了的话,就拷贝。</div><div class="line">1) 编程方式实现剪切板的拷贝</div><div class="line">Clipboard.SetDataObject(DataGridView1.GetClipboardContent()) </div><div class="line">2) DataGridView 的数据粘贴</div><div class="line">实现剪切板的拷贝比较容易,但是实现 DataGridView 的直接粘贴就比较难了。「Ctrl + V」按下进行粘贴时,DataGridView 没有提供方法,只能自己实现。</div><div class="line">以下,是粘贴时简单的事例代码,将拷贝数据粘贴到以选择单元格开始的区域内。</div><div class="line">[C#]</div><div class="line">//当前单元格是否选择的判断</div><div class="line">if (DataGridView1.CurrentCell == null)</div><div class="line">return;</div><div class="line">int insertRowIndex = DataGridView1.CurrentCell.RowIndex;</div><div class="line">// 获取剪切板的内容,并按行分割</div><div class="line">string pasteText = Clipboard.GetText();</div><div class="line">if (string.IsNullOrEmpty(pasteText))</div><div class="line">return;</div><div class="line">pasteText = pasteText.Replace(" ", " ");</div><div class="line">pasteText = pasteText.Replace(' ', ' ');</div><div class="line">pasteText.TrimEnd(new char[] { ' ' });</div><div class="line">string[] lines = pasteText.Split(' ');</div><div class="line">bool isHeader = true;</div><div class="line">foreach (string line in lines)</div><div class="line">{</div><div class="line">// 是否是列头</div><div class="line">if (isHeader)</div><div class="line">{</div><div class="line">isHeader = false;</div><div class="line">continue;</div><div class="line">}</div><div class="line">// 按 Tab 分割数据</div><div class="line">string[] vals = line.Split(' ');</div><div class="line">// 判断列数是否统一</div><div class="line">if (vals.Length - 1 != DataGridView1.ColumnCount)</div><div class="line">throw new ApplicationException("粘贴的列数不正确。");</div><div class="line">DataGridViewRow row = DataGridView1.Rows[insertRowIndex];</div><div class="line">// 行头设定</div><div class="line">row.HeaderCell.Value = vals[0];</div><div class="line">// 单元格内容设定</div><div class="line">for (int i = 0; i < row.Cells.Count; i++)</div><div class="line">{</div><div class="line">row.Cells.Value = vals[i + 1];</div><div class="line">}</div><div class="line">// DataGridView的行索引+1</div><div class="line">insertRowIndex++;</div><div class="line">}</div><div class="line">? DataGridView 单元格的ToolTip的设置</div><div class="line">DataGridView.ShowCellToolTips = True 的情况下, 单元格的 ToolTip 可以表示出来。对于单元格窄小,无法完全显示的单元格, ToolTip 可以显示必要的信息。</div><div class="line">1) 设定单元格的ToolTip内容</div><div class="line">[C#]</div><div class="line">// 设定单元格的ToolTip内容</div><div class="line">DataGridView1[0, 0].ToolTipText = "该单元格的内容不能修改";</div><div class="line">// 设定列头的单元格的ToolTip内容</div><div class="line">DataGridView1.Columns[0].ToolTipText = "该列只能输入数字";</div><div class="line">// 设定行头的单元格的ToolTip内容</div><div class="line">DataGridView1.Rows[0].HeaderCell.ToolTipText = "该行单元格内容不能修改";</div><div class="line">2) CellToolTipTextNeeded 事件</div><div class="line">在批量的单元格的 ToolTip 设定的时候,一个一个指定那么设定的效率比较低, 这时候可以利用 CellToolTipTextNeeded 事件。当单元格的 ToolTipText 变化的时候也会引发该事件。但是,当DataGridView的DataSource被指定且VirualMode=True的时候,该事件不会被引发。</div><div class="line">[C#]</div><div class="line">// CellToolTipTextNeeded事件处理方法</div><div class="line">private void DataGridView1_CellToolTipTextNeeded(object sender,</div><div class="line">DataGridViewCellToolTipTextNeededEventArgs e)</div><div class="line">{</div><div class="line">e.ToolTipText = e.ColumnIndex.ToString() + ", " + e.RowIndex.ToString();</div><div class="line">}</div><div class="line">? DataGridView 的右键菜单(ContextMenuStrip) </div><div class="line">DataGridView, DataGridViewColumn, DataGridViewRow, DataGridViewCell 有 ContextMenuStrip 属性。可以通过设定 ContextMenuStrip 对象来控制 DataGridView 的右键菜单的显示。 DataGridViewColumn 的 ContextMenuStrip 属性设定了 除了列头以外的单元格的右键菜单。 DataGridViewRow 的 ContextMenuStrip 属性设定了除了行头以外的单元格的右键菜单。DataGridViewCell 的 ContextMenuStrip 属性设定了指定单元格的右键菜单。 </div><div class="line">[C#]</div><div class="line">// DataGridView 的 ContextMenuStrip 设定</div><div class="line">DataGridView1.ContextMenuStrip = this.ContextMenuStrip1;</div><div class="line">// 列的 ContextMenuStrip 设定</div><div class="line">DataGridView1.Columns[0].ContextMenuStrip = this.ContextMenuStrip2;</div><div class="line">// 列头的 ContextMenuStrip 设定</div><div class="line">DataGridView1.Columns[0].HeaderCell.ContextMenuStrip = this.ContextMenuStrip2;</div><div class="line">// 行的 ContextMenuStrip 设定</div><div class="line">DataGridView1.Rows[0].ContextMenuStrip = this.ContextMenuStrip3;</div><div class="line">// 单元格的 ContextMenuStrip 设定</div><div class="line">DataGridView1[0, 0].ContextMenuStrip = this.ContextMenuStrip4;</div><div class="line">对于单元格上的右键菜单的设定,优先顺序是: Cell > Row > Column > DataGridView</div><div class="line">? CellContextMenuStripNeeded、RowContextMenuStripNeeded 事件</div><div class="line">利用 CellContextMenuStripNeeded 事件可以设定单元格的右键菜单,尤其但需要右键菜单根据单元格值的变化而变化的时候。比起使用循环遍历,使用该事件来设定右键菜单的效率更高。但是,在DataGridView使用了DataSource绑定而且是VirtualMode的时候,该事件将不被引发。</div><div class="line">[C#]</div><div class="line">// CellContextMenuStripNeeded事件处理方法</div><div class="line">private void DataGridView1_CellContextMenuStripNeeded(object sender,</div><div class="line">DataGridViewCellContextMenuStripNeededEventArgs e)</div><div class="line">{</div><div class="line">DataGridView dgv = (DataGridView)sender;</div><div class="line">if (e.RowIndex < 0)</div><div class="line">{</div><div class="line">// 列头的ContextMenuStrip设定</div><div class="line">e.ContextMenuStrip = this.ContextMenuStrip1;</div><div class="line">}</div><div class="line">else if (e.ColumnIndex < 0)</div><div class="line">{</div><div class="line">// 行头的ContextMenuStrip设定</div><div class="line">e.ContextMenuStrip = this.ContextMenuStrip2;</div><div class="line">}</div><div class="line">else if (dgv[e.ColumnIndex, e.RowIndex].Value is int)</div><div class="line">{</div><div class="line">// 如果单元格值是整数时</div><div class="line">e.ContextMenuStrip = this.ContextMenuStrip3;</div><div class="line">}</div><div class="line">}</div><div class="line">同样,可以通过 RowContextMenuStripNeeded 事件来设定行的右键菜单。 [C#]</div><div class="line">// RowContextMenuStripNeeded事件处理方法</div><div class="line">private void DataGridView1_RowContextMenuStripNeeded(object sender,</div><div class="line">DataGridViewRowContextMenuStripNeededEventArgs e)</div><div class="line">{</div><div class="line">DataGridView dgv = (DataGridView)sender;</div><div class="line">// 当"Column1"列是Bool型且为True时、设定其的ContextMenuStrip</div><div class="line">object boolVal = dgv["Column1", e.RowIndex].Value;</div><div class="line">Console.WriteLine(boolVal);</div><div class="line">if (boolVal is bool && (bool)boolVal)</div><div class="line">{</div><div class="line">e.ContextMenuStrip = this.ContextMenuStrip1;</div><div class="line">}</div><div class="line">}</div><div class="line">CellContextMenuStripNeeded 事件处理方法的参数中、「e.ColumnIndex=-1」表示行头、「e.RowIndex=-1」表示列头。RowContextMenuStripNeeded则不存在「e.RowIndex=-1」的情况。</div><div class="line">? DataGridView 的单元格的边框、 网格线样式的设定 </div><div class="line">1) DataGridView 的边框线样式的设定</div><div class="line">DataGridView 的边框线的样式是通过 DataGridView.BorderStyle 属性来设定的。 BorderStyle 属性设定值是一个</div><div class="line">BorderStyle 枚举: FixedSingle(单线,默认)、Fixed3D、None。</div><div class="line">2) 单元格的边框线样式的设定</div><div class="line">单元格的边框线的样式是通过 DataGridView.CellBorderStyle 属性来设定的。 CellBorderStyle 属性设定值是</div><div class="line">DataGridViewCellBorderStyle 枚举。(详细参见 MSDN)</div><div class="line">另外,通过 DataGridView.ColumnHeadersBorderStyle 和 RowHeadersBorderStyle 属性可以修改 DataGridView 的头部的单元格边框线样式。属性设定值是 DataGridViewHeaderBorderStyle 枚举。(详细参见 MSDN)</div><div class="line">3) 单元格的边框颜色的设定</div><div class="line">单元格的边框线的颜色可以通过 DataGridView.GridColor 属性来设定的。默认是 ControlDarkDark 。但是只有在 CellBorderStyle 被设定为 Single、SingleHorizontal、SingleVertical 的条件下才能改变其边框线的颜色。同样,ColumnHeadersBorderStyle 以及 RowHeadersBorderStyle 只有在被设定为 Single 时,才能改变颜色。</div><div class="line">4) 单元格的上下左右的边框线式样的单独设定</div><div class="line">CellBorderStyle只能设定单元格全部边框线的式样。要单独改变单元格某一边边框式样的话,需要用到DataGridView.AdvancedCellBorderStyle属性。如示例:</div><div class="line">同样,设定行头单元格的属性是: AdvancedRowHeadersBorderStyle, 设定列头单元格属性是:AdvancedColumnHeadersBorderStyle。</div><div class="line">? DataGridView 单元格表示值的自定义</div><div class="line">通过CellFormatting事件,可以自定义单元格的表示值。(比如:值为Error的时候,单元格被设定为红色)</div><div class="line">下面的示例:将“Colmn1”列的值改为大写。</div><div class="line">[C#]</div><div class="line">//CellFormatting 事件处理方法</div><div class="line">private void DataGridView1_CellFormatting(object sender,</div><div class="line">DataGridViewCellFormattingEventArgs e)</div><div class="line">{</div><div class="line">DataGridView dgv = (DataGridView)sender;</div><div class="line">// 如果单元格是“Column1”列的单元格</div><div class="line">if (dgv.Columns[e.ColumnIndex].Name == "Column1" && e.Value is string)</div><div class="line">{</div><div class="line">// 将单元格值改为大写</div><div class="line">string str = e.Value.ToString();</div><div class="line">e.Value = str.ToUpper();</div><div class="line">// 应用该Format,Format完毕。</div><div class="line">e.FormattingApplied = true;</div><div class="line">}</div><div class="line">}</div><div class="line">CellFormatting事件的DataGridViewCellFormattingEventArgs对象的Value属性一开始保存着未被格式化的值。当Value属性被设定表示用的文本之后,把FormattingApplied属性做为True,告知DataGridView文本已经格式化完毕。如果不这样做的话,DataGridView会根据已经设定的Format,NullValue,DataSourceNullValue,FormatProvider属性会将Value属性会被重新格式化一遍。</div><div class="line">? DataGridView 用户输入时,单元格输入值的设定</div><div class="line">通过 DataGridView.CellParsing 事件可以设定用户输入的值。下面的示例:当输入英文文本内容的时候,立即被改变为大写。</div><div class="line">[C#]</div><div class="line">//CellParsing 事件处理方法</div><div class="line">private void DataGridView1_CellParsing(object sender,</div><div class="line">DataGridViewCellParsingEventArgs e)</div><div class="line">{</div><div class="line">DataGridView dgv = (DataGridView)sender;</div><div class="line">//单元格列为“Column1%2</div></pre></td></tr></table></figure>
<hr>
<blockquote>
<p>更多资料请加群获取</p>
</blockquote>
]]></content>
</entry>
<entry>
<title><![CDATA[Home]]></title>
<url>/Home/index.html</url>
<content type="html"><![CDATA[<blockquote><p>本博客只是用来记录个人在和代码打交道的生涯中碰到的一些问题以及解决方案,还有一些无意中发现的小技巧等等,供以后用来查阅。</p>
</blockquote>
<h2 id="反馈与建议"><a href="#反馈与建议" class="headerlink" title="反馈与建议"></a>反馈与建议</h2><ul>
<li>微博:<a href="http://weibo.com/u/5811462452" target="_blank" rel="external">@Microera</a>,<a href="http://weibo.com/u/5811462452" target="_blank" rel="external">@朕封你为妃_</a></li>
<li>邮箱:<a href="mailto:zero@zerodeg.cn">zero@zerodeg.cn</a></li>
<li>群号:512901469[<a href="%3Ca%20target=%22_blank%22%20href=%22//shang.qq.com/wpa/qunwpa?idkey=fb02ed0220136119afe3c315c1c43e228ad7b5fa3ba1ecc9cf714091d870f05e%22%3E%3Cimg%20border=%220%22%20src=%22//pub.idqqimg.com/wpa/images/group.png%22%20alt=%22Blog%E7%A4%BE%E4%BA%A4%E7%BE%A4%22%20title=%22Blog%E7%A4%BE%E4%BA%A4%E7%BE%A4%22%3E%3C/a%3E">点我加群</a>]</li>
</ul>
]]></content>
</entry>
<entry>
<title><![CDATA[欢迎来到我的个人博客]]></title>
<url>/Home/%E6%AC%A2%E8%BF%8E%E6%9D%A5%E5%88%B0%E6%88%91%E7%9A%84%E5%8D%9A%E5%AE%A2.html</url>
<content type="html"><![CDATA[<blockquote><p>本博客只是用来记录个人在和代码打交道的生涯中碰到的一些问题以及解决方案,还有一些无意中发现的小技巧等等,供以后用来查阅。</p>
</blockquote>
<h2 id="反馈与建议"><a href="#反馈与建议" class="headerlink" title="反馈与建议"></a>反馈与建议</h2><ul>
<li>微博:<a href="http://weibo.com/u/5811462452" target="_blank" rel="external">@Microera</a>,<a href="http://weibo.com/u/5811462452" target="_blank" rel="external">@朕封你为妃_</a></li>
<li>邮箱:<a href="mailto:zero@zerodeg.cn">zero@zerodeg.cn</a></li>
<li>群号:512901469[<a href="https://jq.qq.com/?_wv=1027&k=4FIJvv0" target="_blank" rel="external">点我加群</a>]</li>
</ul>
]]></content>
</entry>
<entry>
<title><![CDATA[Microera的博客留言版]]></title>
<url>/about/index.html</url>
<content type="html"><![CDATA[<blockquote><p>本博客只是用来记录个人在和代码打交道的生涯中碰到的一些问题以及解决方案,还有一些无意中发现的小技巧等等,供以后用来查阅。</p>
</blockquote>
<h2 id="反馈与建议"><a href="#反馈与建议" class="headerlink" title="反馈与建议"></a>反馈与建议</h2><ul>
<li>微博:<a href="http://weibo.com/u/5811462452" target="_blank" rel="external">@Microera</a>,<a href="http://weibo.com/u/5811462452" target="_blank" rel="external">@朕封你为妃_</a></li>
<li>邮箱:<a href="mailto:zero@zerodeg.cn">zero@zerodeg.cn</a></li>
<li>群号:512901469[<a href="https://jq.qq.com/?_wv=1027&k=4FIJvv0" target="_blank" rel="external">点我加群</a>]</li>
</ul>
]]></content>
</entry>
<entry>
<title><![CDATA[archives]]></title>
<url>/archives/index.html</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[books]]></title>
<url>/books/index.html</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[categories]]></title>
<url>/categories/index.html</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[link]]></title>
<url>/link/index.html</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[repository]]></title>
<url>/repository/index.html</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[tags]]></title>
<url>/tags/index.html</url>
<content type="html"></content>
</entry>
<entry>
<title><![CDATA[works]]></title>
<url>/works/index.html</url>
<content type="html"></content>
</entry>
</search>