知识点:一:DatagridView 导出数据到Excel(两种方法)
二:DatagridView 中显示密码列
三:WinForm最简单两GridView同步滚动
四:DataGridView添加任何控件
一.DatagridView 导出数据到Excel
有两种方法:一种是直接利用I/O读写去生成非标准格式的xls文件,速度很快。另外种就是直接使用EXCEL的COM组件实现,需要在项目中引用EXCEL的COM组件。
代码
(1)利用I/O。
2 {
3
4 // 利用流导出Exce
5 saveFileDialog.Filter = " Execl files (*.xls)|*.xls " ;
6 saveFileDialog.FileName = " mydata " ;
7
8 saveFileDialog.FilterIndex = 0 ;
9
10 saveFileDialog.RestoreDirectory = true ;
11
12 saveFileDialog.CreatePrompt = true ;
13
14 saveFileDialog.Title = " Export Excel File To " ;
15 saveFileDialog.ShowDialog();
16 Stream myStream;
17
18 try
19 {
20 myStream = saveFileDialog.OpenFile();
21 }
22 catch
23 {
24 return ;
25 }
26
27 // StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding("gb2312"));
28 StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding( - 0 ));
29 string str = "" ;
30 try
31 {
32 // 写标题
33 for ( int i = 0 ; i < this .DataGridView1.ColumnCount; i ++ )
34 {
35 if (i > 0 )
36 {
37 str += " \t " ;
38 }
39 str += DataGridView1.Columns[i].HeaderText;
40
41 }
42 sw.WriteLine(str);
43 // 写内容
44
45 for ( int j = 0 ; j < DataGridView1.Rows.Count; j ++ )
46 {
47 string tempStr = "" ;
48
49 for ( int k = 0 ; k < DataGridView1.Columns.Count; k ++ )
50 {
51 if (k > 0 )
52 {
53 tempStr += " \t " ;
54 }
55
56 tempStr += DataGridView1.Rows[j].Cells[k].Value.ToString();
57
58 }
59 sw.WriteLine(tempStr);
60
61 }
62 sw.Close();
63 myStream.Close();
64
65 }
66
67 catch (Exception ex)
68 {
69 MessageBox.Show(ex.ToString());
70 }
71
72 finally
73 {
74 sw.Close();
75 myStream.Close();
76 }
77 // System.Diagnostics.Stopwatch swT = new System.Diagnostics.Stopwatch();
78 // swT.Start();
79 // long ts1 = swT.ElapsedMilliseconds;
80 // MessageBox.Show(ts1.ToString() + "\n");
81 }
(2).利用组件。
首先添加Excel引用
实现代码
2 {
3 string saveFileName = "" ;
4 // bool fileSaved = false;
5 SaveFileDialog saveDialog = new SaveFileDialog();
6 saveDialog.DefaultExt = " xls " ;
7 saveDialog.Filter = " Excel文件|*.xls " ;
8 saveDialog.FileName = fileName;
9 saveDialog.ShowDialog();
10 saveFileName = saveDialog.FileName;
11 if (saveFileName.IndexOf( " : " ) < 0 ) return ; // 被点了取消
12 Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
13 if (xlApp == null )
14 {
15 MessageBox.Show( " 无法创建Excel对象,可能您的机子未安装Excel " );
16 return ;
17 }
18
19 Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
20 Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
21 Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[ 1 ]; // 取得sheet1
22
23 // 写入标题
24 for ( int i = 0 ; i < myDGV.ColumnCount; i ++ )
25 {
26 worksheet.Cells[ 1 , i + 1 ] = myDGV.Columns[i].HeaderText;
27 }
28 // 写入数值
29 for ( int r = 0 ; r < myDGV.Rows.Count; r ++ )
30 {
31 for ( int i = 0 ; i < myDGV.ColumnCount; i ++ )
32 {
33 worksheet.Cells[r + 2 , i + 1 ] = myDGV.Rows[r].Cells[i].Value;
34 }
35 System.Windows.Forms.Application.DoEvents();
36 }
37 worksheet.Columns.EntireColumn.AutoFit(); // 列宽自适应
38 // if (Microsoft.Office.Interop.cmbxType.Text != "Notification")
39 // {
40 // Excel.Range rg = worksheet.get_Range(worksheet.Cells[2, 2], worksheet.Cells[ds.Tables[0].Rows.Count + 1, 2]);
41 // rg.NumberFormat = "00000000";
42 // }
43
44 if (saveFileName != "" )
45 {
46 try
47 {
48 workbook.Saved = true ;
49 workbook.SaveCopyAs(saveFileName);
50 // fileSaved = true;
51 }
52 catch (Exception ex)
53 {
54 // fileSaved = false;
55 MessageBox.Show( " 导出文件时出错,文件可能正被打开!\n " + ex.Message);
56 }
57
58 }
59 // else
60 // {
61 // fileSaved = false;
62 // }
63 xlApp.Quit();
64 GC.Collect(); // 强行销毁
65 // if (fileSaved && System.IO.File.Exists(saveFileName)) System.Diagnostics.Process.Start(saveFileName); // 打开EXCEL
66 MessageBox.Show( " 导出成功 " , " 提示 " , MessageBoxButtons.OK);
67 }
以上两种方法都能实现Excel的导出,根据验证第一种方法的导出效率要比第二种要高很多,至于选择哪种导出方式以及性能的具体对比还需要读者详细的去衡量。
二.显示密码列
DataGridView.CellFormatting事件
在单元格的内容需要设置格式以便于显示时发生。
命名空间:System.Windows.Forms
程序集:System.Windows.Forms(在 system.windows.forms.dll 中)
如:
/// 单元格显示格式事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_CellFormatting( object sender,
DataGridViewCellFormattingEventArgs e)
{
// 把第4列显示*号,*号的个数和实际数据的长度相同
if (e.ColumnIndex == 3 )
{
if (e.Value != null && e.Value.ToString().Length > 0 )
{
e.Value = new string ( ' * ' ,e.Value.ToString().Length);
}
}
}
DataGridView.EditingControlShowing 事件在显示用于编辑单元格的控件时发生。
命名空间: System.Windows.Forms
程序集: System.Windows.Forms(在 system.windows.forms.dll 中)
2
3 /// 编辑单元格控件事件
4
5 /// </summary>
6
7 /// <param name="sender"></param>
8
9 /// <param name="e"></param>
10
11 private void dataGridView1_EditingControlShowing( object sender,
12
13 DataGridViewEditingControlShowingEventArgs e)
14
15 {
16
17 // 编辑第4列时,把第4列显示为*号
18
19 TextBox t = e.Control as TextBox;
20
21 if (t != null )
22
23 {
24
25 if ( this .dataGridView1.CurrentCell.ColumnIndex == 3 )
26
27 t.PasswordChar = ' * ' ;
28
29 else
30
31 t.PasswordChar = new char ();
32
33 }
34
35 }
36
三.WinForm最简单两GridView同步滚动
DataGridView. Scroll网格水平滚动或垂直滚动引发的事件。
如何让两个DataGridView保持同步滚动?
一个最简单方法: 不过大数据量时界面会闪。
{
dataGridView2.FirstDisplayedScrollingRowIndex = DataGridView1.FirstDisplayedScrollingRowIndex;
dataGridView2.HorizontalScrollingOffset = DataGridView1.HorizontalScrollingOffset;
}
private void dataGridView2_Scroll( object sender, ScrollEventArgs e)
{
DataGridView1.FirstDisplayedScrollingRowIndex = dataGridView2.FirstDisplayedScrollingRowIndex;
DataGridView1.HorizontalScrollingOffset = dataGridView2.HorizontalScrollingOffset;
}
四.DataGridView添加任何控件
{
if (e.Control is DataGridViewTextBoxEditingControl)
{
TextBox textbox = (TextBox)e.Control;
// Panel p = (Panel)textbox.Parent; // 找到当前的父控件,其实就是一个Panel,你将此Panel中的控件清空,然后你就可以在Panel中加入任何控件并随意布局了
Panel p = (Panel)e.Control.Parent;
p.Controls.Clear();
btn.Width = 38 ;
btn.Text = textbox.Text;
btn.Click += new EventHandler(btn_Click);
p.Controls.Add(btn);
}
}
利用容器(panel)添加控件。
DataGridView的用法很多,后续会继续介绍。
如有不足欢迎大家指出。
Demo Demo中包含很多例子含有(上)的Demo
或有疑问,可eMail 点击此处
http://www.elivn.com/ <a href="http://www.elivn.com/%22%3Eelivn%3C/a>
如有转载,请注明出处!