winform datagridview控件使用


最近做項目時,顯示查詢結果總需要綁定到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);
                    }
                }
                #endregion
                OleDataBaseHandle.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轉換為datatable
                return 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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM