最近做项目时,显示查询结果总需要绑定到datagridview控件上显示,总结了给datagridview绑定数据的方式,以及导出datagridview数据到excel表格,如有错误请多指教

1.直接绑定数据源,可以绑定的数据格式有List<T>,DataTable,DataSet等,

this.dataGridView1.DataSource = list;

this.dataGridView1.DataSource = table;

this.dataGridView1.DataSource =ds.Tables["表名"];

2.手动绑定datagridview指定列的数据,datagridview列如下图:

绑定数据代码如下:

DataTable dt = cdh.checkDB_typeValue(list_rd);
if (dt.Rows.Count>0){//dataGridView2.DataSource = dt;for (int i = 0; i < dt.Rows.Count; i++){DataGridViewRow dr = new DataGridViewRow();dataGridView2.Rows.Add(dr);dataGridView2.Rows[i].Cells["档案类型"].Value = dt.Rows[i]["档案类型"].ToString();dataGridView2.Rows[i].Cells["字段"].Value = dt.Rows[i]["字段"].ToString();dataGridView2.Rows[i].Cells["错误类型"].Value = dt.Rows[i]["错误类型"].ToString();dataGridView2.Rows[i].Cells["错误数据"].Value = dt.Rows[i]["错误数据"].ToString();dataGridView2.Rows[i].Cells["档案号"].Value = dt.Rows[i]["档案号"].ToString();}btn_export.Enabled = true;}

绑定datagridview数据

3.自动生成datagridview控件并绑定数据和单元格点击事件

foreach (KeyValuePair<string, List<string>> item in ckImageMethod.errorFiles){//实例化tabpage对象TabPage tpage = new TabPage();tpage.Text = item.Key;tpage.AutoScroll = true;//实例化datagridview对象DataGridView dgv = new DataGridView();dgv.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;dgv.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;dgv.Location = new System.Drawing.Point(3, 3);dgv.Size = new System.Drawing.Size(tabControl2.Width - 15, tabControl2.Height - 35);//给datagridview添加单元格点击事件dgv.CellContentClick += Dgv_CellContentClick;//给datagridview添加文本列DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn();col1.HeaderText = "文件名";DataGridViewTextBoxColumn col2 = new DataGridViewTextBoxColumn();col2.HeaderText = "文件路径";//添加按钮列DataGridViewButtonColumn col3 = new DataGridViewButtonColumn();col3.HeaderText = "操作";col3.Name = "btnModify";col3.DefaultCellStyle.NullValue = "打开文件";dgv.Columns.Add(col1);dgv.Columns.Add(col2);dgv.Columns.Add(col3);foreach (string filePath in item.Value){string path = filePath;//给datagridview添加一行数据,因为第三列时按钮,所以不添加值也会默认添加按钮dgv.Rows.Add(path.Substring(path.LastIndexOf('\\') + 1), path);}//添加datagridview控件到tabpage中
                    tpage.Controls.Add(dgv);//添加tabpage到tabControl中
                    tabControl2.TabPages.Add(tpage);}    

后台添加datagridview控件并绑定数据

单元格点击事件:

private void Dgv_CellContentClick(object sender, DataGridViewCellEventArgs e){DataGridView dgv = sender as DataGridView;//点击button按钮事件if (dgv.Columns[e.ColumnIndex].Name == "btnModify" && e.RowIndex >= 0){if (e.RowIndex == (dgv.RowCount - 1)){return;}//说明点击的列是DataGridViewButtonColumn列string path = dgv.Rows[e.RowIndex].Cells[1].Value.ToString();if (Directory.Exists(path)){//打开文件夹
                    System.Diagnostics.Process.Start(path);}else{//打开文件所在文件夹DirectoryInfo fi = new DirectoryInfo(path);System.Diagnostics.Process.Start(fi.Parent.FullName);}}}

单元格点击事件

4.导出datagridview数据到excel中,我做的比较麻烦,而且我导出的是datagridview绑定的数据源datatable,如果要导出datagridview中显示的数据,要先把datagridview的数据存到datatable中,再导出。下面是导出方法

private void btn_export_Click(object sender, EventArgs e){if (string.IsNullOrEmpty(txtPath.Text)){MessageBox.Show("保存路径不能为空!", "提示");return;}Task tk = new Task(Way);//MessageBox.Show("正在导出请稍后...");lb1.Visible = true;lb1.Text = "数据导出中,请稍后...";txtPath.Visible = false;btn_export.Enabled = false;tk.Start();}private void Way(){dataexcel.DataExcelExport(dt, txtPath.Text, "错误数据导出", "EXCEL");MessageBox.Show("数据导出完成");btn_export.Enabled = true;txtPath.Visible = true;lb1.Visible = false;}

导出datagridview数据

调用的类的方法:

public class DataExcelExportHandle {public delegate void Del_error(string StrError);public static event Del_error aa;public void DataExcelExport(DataTable QueryTable, string FilePath, string TableName, string DbType){List<string> ErrorList = new List<string>();string Query = string.Empty;//数据导出语句try{//判断Excel版本string StrVerSion = FilePath.Split('.')[1].ToString();string DataConnect = string.Empty;if (DbType == "EXCEL"){if (StrVerSion.ToLower() == "xls"){DataConnect = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + FilePath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=2'";}if (StrVerSion.ToLower() == "xlsx"){//DataConnect = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " + FilePath + ";Extended Properties='Excel 12.0 Macro; HDR = NO'";DataConnect = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " + FilePath + ";Extended Properties='Excel 12.0 Xml; HDR = NO'";}}//else//{//    if (StrVerSion.ToLower() == "mdb")//    {//        DataConnect = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source =" + FilePath;//        //判断ACCESS数据文件是否存在  不存在则创建//        if (!File.Exists(FilePath))//        {//            Catalog catalog = new Catalog();//            catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FilePath + ";Jet OLEDB:Engine Type=5");//        }//    }//    if (StrVerSion.ToLower() == "accdb")//    {//        DataConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FilePath;//        //判断ACCESS数据文件是否存在  不存在则创建//        if (!File.Exists(FilePath))//        {//            ADOX.Catalog catalog = new ADOX.Catalog();//            catalog.Create("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FilePath + ";");//        }//    }//}//string ConnectStr = CurrencyHandle.GetXmlNumber("DataBaseDeploy", "SqlConnect");//DataTable dt = SqlDataBaseHandle.GetTable(StrDataQuery, ConnectStr);//根据表名字段动态创建表字段string CreateColumn = "create table " + TableName + " (";string QueryNumberStr = "insert into " + TableName + " (";for (int i = 0; i < QueryTable.Columns.Count; i++){CreateColumn = CreateColumn + QueryTable.Columns[i].ColumnName + " text,";QueryNumberStr = QueryNumberStr + QueryTable.Columns[i].ColumnName + ",";}QueryNumberStr = QueryNumberStr.TrimEnd(',');CreateColumn = CreateColumn.TrimEnd(',');CreateColumn = CreateColumn + ")";//创建表
                OleDataBaseHandle.OleConnectOpen(DataConnect);OleDataBaseHandle.OleImplement(CreateColumn);Query = QueryNumberStr + ") values(";for (int i = 0; i < QueryTable.Columns.Count; i++){Query = Query + "@" + QueryTable.Columns[i].ColumnName + ",";}Query = Query.Substring(0, Query.Length - 1);Query = Query + ")";int CountIndex = 1;//记录数据条数string SysTable = TableName;#region 数据导出for (int i = 0; i < QueryTable.Rows.Count; i++){try{//当导出数据超过限制时将自动创建新的表if (DbType == "EXCEL"){if (StrVerSion.ToLower() == "xlsx"){if (i > CountIndex * 1000000){CreateColumn = CreateColumn.Replace(TableName, SysTable + CountIndex);OleDataBaseHandle.OleImplement(CreateColumn);Query = Query.Replace(TableName, SysTable + CountIndex);TableName = TableName + CountIndex;CountIndex++;}}else{if (i > CountIndex * 65000){CreateColumn = CreateColumn.Replace(TableName, SysTable + CountIndex);OleDataBaseHandle.OleImplement(CreateColumn);Query = Query.Replace(TableName, SysTable + CountIndex);TableName = TableName + CountIndex;CountIndex++;}}}List<OleDbParameter> oleList = new List<OleDbParameter>();for (int k = 0; k < QueryTable.Columns.Count; k++){OleDbParameter prop = null;try{if (QueryTable.Rows[i][k] == null){prop = new OleDbParameter("@" + QueryTable.Columns[k].ColumnName, "");}else{prop = new OleDbParameter("@" + QueryTable.Columns[k].ColumnName, QueryTable.Rows[i][k].ToString());}}catch (Exception excc){aa("导出失败" + Query);ErrorList.Add(excc.Message);}oleList.Add(prop);}if (!OleDataBaseHandle.OleImplement(Query, oleList)){aa("导出失败" + Query);ErrorList.Add("导出失败" + Query);}}catch (Exception exx){aa(exx.Message + Query);ErrorList.Add(exx.Message + Query);}}#endregionOleDataBaseHandle.OleConnectColse();}catch (Exception ex){aa(ex.Message + Query);ErrorList.Add(ex.Message + Query);}finally{if (ErrorList != null && ErrorList.Count > 0){ToolHelper.ErrorInfoSave(ErrorList);}}}}

View Code

上面方法调用的ole操作类:

https://www.cnblogs.com/Li232/p/10813918.html

/// <summary>/// Ole操作类/// </summary>public class OleDataBaseHandle{private static OleDbConnection con = null;private static OleDbCommand cmd = null;/// <summary>/// 通过文件路径 获取文件的所有表名/// </summary>/// <param name="Filename">文件路径</param>/// <returns></returns>public static DataTable GetFileTableName(string Filename){string DbConnect = string.Empty;try{DbConnect = GetConnect(Filename);//通过文件获取连接字符串con = new OleDbConnection(DbConnect);con.Open();DataTable dt = new DataTable();dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });return dt;}catch (Exception){return null;}finally{if (cmd != null){cmd.Dispose();}if (con != null){if (con.State == ConnectionState.Open){con.Close();}}}}/// <summary>/// 通过文件路径和表名获取所有数据(现支持EXCEL2003和ACCESS2003)/// </summary>/// <param name="Filename">文件路径</param>/// <param name="TableName">表名</param>/// <returns></returns>public static DataTable GetFileTableData(string Filename, string TableName){string DbConnect = string.Empty;try{DbConnect = GetConnect(Filename);//通过文件获取连接字符串con = new OleDbConnection(DbConnect);con.Open();DataTable dt = new DataTable();cmd = new OleDbCommand("select * from [" + TableName + "]", con);OleDbDataAdapter dapter = new OleDbDataAdapter(cmd);dapter.Fill(dt);return dt;}catch{return null;}finally{if (cmd != null){cmd.Dispose();}if (con != null){if (con.State == ConnectionState.Open){con.Close();}}}}/// <summary>/// 通过数据文件和表名获取该表的所有列(现支持EXCEL2003和ACCESS2003)/// </summary>/// <param name="Filename">文件路径</param>/// <param name="TableName">文件表名</param>/// <returns></returns>public static DataTable GetFileTableName(string Filename, string TableName){List<string> ErrorList = new List<string>();OleDbCommand cmd = null;OleDbConnection con = null;string DbConnect = string.Empty;try{DbConnect = GetConnect(Filename);//通过文件获取连接字符串con = new OleDbConnection(DbConnect);con.Open();DataTable dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, TableName, null });if (dt == null || dt.Rows.Count < 1){return null;}else{return dt;}}catch (Exception ex){ErrorList.Add(ex.Message);return null;}finally{if (cmd != null){cmd.Dispose();}if (con != null){if (con.State == ConnectionState.Open){con.Close();}}}}/// <summary>/// 通过语句执行返回结果true false/// </summary>/// <param name="StrQuery">执行的SQL语句</param>/// <returns></returns>public static bool OleImplement(string StrQuery, string ConnectStr){try{con = new OleDbConnection(ConnectStr);con.Open();cmd = new OleDbCommand(StrQuery, con);int a = cmd.ExecuteNonQuery();if (a != 0){return true;}else{return false;}}catch{return false;}finally{if (cmd != null){cmd.Dispose();}if (con != null){if (con.State == ConnectionState.Open){con.Close();}}}}/// <summary>/// 通过数据文件和表名获取该表的所有列/// </summary>/// <param name="StrQuery">所执行的SQL语句</param>/// <returns></returns>public static bool OleImplement(string StrQuery){try{cmd = new OleDbCommand(StrQuery, con);int a = cmd.ExecuteNonQuery();if (a != 0){return true;}else{return false;}}catch (Exception exxx){return false;}}/// <summary>/// 通过连接字符串建立长链接/// </summary>/// <param name="StrConnect">连接数据库字符串</param>public static void OleConnectOpen(string StrConnect){con = new OleDbConnection(StrConnect);con.Open();}/// <summary>/// 关闭长链接并释放资源/// </summary>public static void OleConnectColse(){if (cmd != null){cmd.Dispose();}if (con != null){if (con.State == ConnectionState.Open){con.Close();con.Dispose();}}}/// <summary>/// 执行参数化SQL语句/// </summary>/// <param name="StrQuery">所执行的SQL语句</param>/// <param name="para">参数化集合</param>/// <returns></returns>public static bool OleImplement(string StrQuery, List<OleDbParameter> para){try{cmd = new OleDbCommand(StrQuery, con);foreach (var item in para){cmd.Parameters.Add(item);}cmd.ExecuteNonQuery();return true;}catch{return false;}}/// <summary>/// 通过文件路径返回ADO连接字符串/// </summary>/// <param name="Filename">文件路径</param>/// <returns></returns>public static string GetConnect(string Filename){string DbConnect = string.Empty;if (Filename.Split('.')[1].ToLower() == "xls"){DbConnect = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + Filename + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=2'";}else if (Filename.Split('.')[1].ToLower() == "xlsx"){DbConnect = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " + Filename + ";Extended Properties='Excel 12.0 Macro; HDR = NO'";}else if (Filename.Split('.')[1].ToLower() == "mdb"){DbConnect = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source =" + Filename;}else if (Filename.Split('.')[1].ToLower() == "accdb"){DbConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Filename;}else{DbConnect = null;}return DbConnect;}/// <summary>/// 执行参数化SQL语句/// </summary>/// <param name="StrQuery">所执行的SQL语句</param>/// <returns></returns>public static DataTable OleGetTable(string FilePath, string StrQuery){OleDbConnection objConn = null;DataTable dt = new DataTable();try{string StrVerSion = FilePath.Split('.')[1].ToString();string DataConnect = string.Empty;if (StrVerSion.ToLower() == "xls"){DataConnect = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + FilePath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";}if (StrVerSion.ToLower() == "xlsx"){DataConnect = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " + FilePath + ";Extended Properties='Excel 12.0 Xml; HDR = NO'";}objConn = new OleDbConnection(DataConnect);objConn.Open();//打开连接//RegistryKey reg_TypeGuessRows = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Jet\4.0\Engines\Excel");//reg_TypeGuessRows.SetValue("TypeGuessRows", 65000);cmd = new OleDbCommand(StrQuery, objConn);OleDbDataAdapter adr = new OleDbDataAdapter();adr.SelectCommand = cmd;adr.Fill(dt);objConn.Close();//OleDbDataReader  reader = cmd.ExecuteReader();//dt.Load(reader); //直接把reader转换为datatablereturn dt;}catch(Exception ex){ToolHelper.ErrorInfoSave(ex.Message);return null;}}}

上述方法中用到的ole操作类

推荐两个百度到的导出datagridview数据的博客地址,这两个写的很简单:

https://www.cnblogs.com/chaowang/p/6265698.html

https://www.cnblogs.com/kongxiaoshuang/p/6062368.html 

 

转载于:https://www.cnblogs.com/Li232/p/10813330.html

winform datagridview控件使用相关推荐

  1. Winform DataGridView控件添加行号

    有很多种方法,这里介绍三种: A: 控件的RowStateChanged事件中添加,RowStateChanged事件是在行的状态更改(例如,失去或获得输入焦点)时发生的事件: 1 e.Row.Hea ...

  2. winform datagridview控件设置列标题字体大小无效问题

    在datagridview控件的columnHeadersDefaultCellStyle属性中设置列标题字体样式后,非运行时看有效,运行时则无效,主要是因为datagridview控件放在panel ...

  3. 断开式 DataGridView控件 winform

    断开式 DataGridView控件 winform 引入dgv控件 绑定数据 dgv控件.数据源 = 仓库中的数据表 示例 private void bindDgv() { // 连接字符串Stri ...

  4. C#Winform的DataGridView控件使用详解2—DataGridView表格样式设置及表格操作

    C#Winform的DataGridView控件使用详解2-DataGridView表格样式设置及表格操作 DataGridView表格样式设置 DataGridView行序号设置 右键弹出控件表格操 ...

  5. (一)C#Winform导入Excel数据到datagridview控件

    C#Winform导入Excel数据到datagridview控件 #此次导入Excel数据借助了ExcelDataReader插件.(由于我需要的是打开工作簿时能够选择工作表绑定于datagridv ...

  6. WinForm中关于DataGridView控件的一些应用

    转载于新浪 美林居士 的博客:            blog.sina.com.cn/s/blog_797a56d20101daiw.html4 在.NET4.0中,以表格形式存储的数据通常是Dat ...

  7. C#Winform的DataGridView控件使用详解1—七种DataGridViewColumn类型使用方法

    C#Winform的DataGridView控件使用详解1-七种DataGridViewColumn类型使用方法 DataGirdView控件Column类型 DataGridViewButtonCo ...

  8. Winform实现在DataGridView控件的单元格中添加多个控件

    Winform实现在DataGridView控件的单元格中添加多个控件 背景 实现思路 关键代码 完整代码下载 背景 DataGridView控件的列是支持TextBoxColumn.ComboBox ...

  9. C#实现WinForm下DataGridView控件从剪切板中进行内容粘贴

    DataGridView是C#中在处理显示表格数据时常用的控件,但是在使用过程中,会发现复制DataGridView控件中的内容比较容易,而把剪切板中拷贝的内容黏贴到DataGridView控件中比较 ...

最新文章

  1. 持续集成工具Jenkins看这篇就够啦!
  2. 使用注解实现ssh整合
  3. choiceformat_ChoiceFormat:数字范围格式
  4. java dfs_Java数据结构与算法 深搜(DFS)的简单使用(一)之排列组合
  5. 飞鸽传书下载,还是飞鸽传书下载
  6. Section 1.3 milk
  7. c 连接mysql数据库_C++连接mysql数据库的两种方法
  8. OSPF在企业网络中的应用
  9. html5高仿mac桌面,WinDynamicDesktop(高仿macOS动态壁纸)
  10. 国家标准《信息安全技术 关键信息基础设施网络安全保护基本要求》试点启动
  11. html音乐歌词同步,html歌词同步代码
  12. 关于timestamp时间范围
  13. Arun Gupta通过将HTML5与Java EE 7拥抱来提高生产力
  14. 象棋世家 v6.0a 官方
  15. 5分钟教你如何设计一个安全web架构
  16. 颜色的前世今生22·显示器偏色怎么办?
  17. 基于python的量化投资(二) ---- 获取量化数据
  18. excel提示“文件已损坏,无法打开”解决方法
  19. Python有什么用?Python 的 10 个实际用途
  20. 探讨刀塔传奇是怎么防止客户端作弊的

热门文章

  1. python是一种通用编程语言-想自学一种编程语言,各种编程语言都有什么区别?...
  2. python3语法错误-【Python3之异常处理】
  3. python手机版打了代码运行不了-三款可以在安卓手机上运行Python代码的软件
  4. python处理数据的优势-【Python数据分析基础】: 数据缺失值处理
  5. 不懂编程可以自学python吗-我不会编程,也可能学会Python吗?
  6. python开发桌面软件-python适合开发桌面软件吗?
  7. python培训班一般多少钱-报一个python培训班多少钱?
  8. python的优缺点有哪些-那么多人选择Python,它的优缺点有哪些?
  9. python之禅中文-python之禅
  10. 流程的python-流畅的Python