• DatagridView 经典用法总结(中)附有可下载Demo


    知识点:一:DatagridView 导出数据到Excel(两种方法)

        二:DatagridView 中显示密码列

        三:WinForm最简单两GridView同步滚动

        四:DataGridView添加任何控件

     

    一.DatagridView 导出数据到Excel                                 

    有两种方法:一种是直接利用I/O读写去生成非标准格式的xls文件,速度很快。另外种就是直接使用EXCEL的COM组件实现,需要在项目中引用EXCEL的COM组件。

    代码

    (1)利用I/O。

     1 private void button4_Click(object sender, EventArgs e)
     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引用

    实现代码

           

     1  public static void DataGridViewToExcel(string fileName, DataGridView myDGV)
     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(":"< 0return//被点了取消 
    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>

    /// 单元格显示格式事件

    /// </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 中)

     1 /// <summary>
     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保持同步滚动?

    一个最简单方法: 不过大数据量时界面会闪。

           

    代码
     private void DataGridView1_Scroll(object sender, ScrollEventArgs e)
     {
        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添加任何控件                                               

     

    代码
    void dataGridView2_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                
    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>

    如有转载,请注明出处!

  • 相关阅读:
    CentOS中用top命令CPU负载
    Oracle文档阅读指南
    修改oracle用户密码永不过期
    让secureCRT以命令行方式启动图形界面
    .NET 2.0 SQL依赖注意事项(转载:原文《使用SQL Server 2005 Query Notification的几个注意事项》)
    SQL Server 2005服务状态管理工具
    一个常用的正则表达验证类
    解决TFS中MSBuild开发项目和开发编译中一些冲突(小技巧)
    ASP.NET 2.0 WebService中传递DataTable参考
    LightningFramework系列(各层详细设计类图)
  • 原文地址:https://www.cnblogs.com/elivn/p/1893411.html
Copyright © 2020-2023  润新知