C# Winform實現(xiàn)導出DataGridView當前頁以及全部數(shù)據(jù)
前言
基本上,所有的業(yè)務系統(tǒng)都會要求有導出的功能,很多人會選擇在每個列表頁加入導出按鈕進行導出;其實,個人感覺挺麻煩的。不知道有多少用過Dev控件的,Dev的GridView控件自帶導出功能有沒有覺得很好用?這一篇就動手實現(xiàn)原生DataGridView的導出功能。
實現(xiàn)
1.新建一個自定義控件繼承自DataGridView,并在其中定義以下屬性
[Description("可導出的最大數(shù)量")] public int ExportMaxCount { get; set; } = 5000;
2.由于是要讓DataGridView自帶導出控件,所以這里使用右鍵菜單來做,并在OnCreateControl事件中進行導出的具體實現(xiàn)。
ContextMenuStrip contextMenuStrip = new ContextMenuStrip(); protected override void OnCreateControl() { base.OnCreateControl(); contextMenuStrip.Items.Add(new ToolStripMenuItem("導出當前頁", null, (s, e) => { if (Rows.Count == 0) { FrmDialog.ShowMessage("沒有數(shù)據(jù)", "提示"); return; } SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Excel文件|*.xlsx"; if (saveFileDialog.ShowDialog() == DialogResult.OK) { DataTable dt = new DataTable(); foreach (DataGridViewColumn column in Columns) { dt.Columns.Add(new DataColumn { ColumnName = column.DataPropertyName, Caption = column.HeaderText }); } foreach (DataGridViewRow dr in Rows) { DataRow dataRow = dt.NewRow(); for (int i = 0; i < dt.Columns.Count; i++) { dataRow[i] = dr.Cells[i].Value; } dt.Rows.Add(dataRow); } ExcelUtils.Export(dt, saveFileDialog.FileName); if (MessageBox.Show("導出成功,是否打開?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes) { Process.Start(saveFileDialog.FileName); } } })); this.ContextMenuStrip = contextMenuStrip;
3.導出是使用NPOI來實現(xiàn)的,具體代碼如下,也可參考之前的導出文章
public static void Export(DataTable dataSource, string fileName) { IWorkbook workbook = new XSSFWorkbook(); ISheet sheet = workbook.CreateSheet("sheet1"); IRow rowHead = sheet.CreateRow(0); for (int j = 0; j < dataSource.Columns.Count; j++) { rowHead.CreateCell(j).SetCellValue(dataSource.Columns[j].Caption); } for (int i = 0; i < dataSource.Rows.Count; i++) { IRow row = sheet.CreateRow(i + 1); for (int j = 0; j < dataSource.Columns.Count; j++) { row.CreateCell(j).SetCellValue(Convert.ToString(dataSource.Rows[i][j])); } } using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { workbook.Write(fs); } workbook.Close(); }
4.到這里,其實就實現(xiàn)了一個公用的帶導出功能的DataGridView控件,但是我們一般都會對數(shù)據(jù)進行分頁顯示,也會有導出全部的功能,這就要重新去獲取服務端的全部數(shù)據(jù)(這里也可以由后端直接生成提供下載地址)。所以我們在控件中需要增加一個導出全部的事件,如果對事件進行了注冊的話,可以在OnMouseDown事件中重新添加一個導出全部的右鍵菜單,并且可以觸發(fā)該事件。
public EventHandler ExportAllData; protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if (e.Button == MouseButtons.Right && ExportAllData != null && !contextMenuStrip.Items.ContainsKey("導出全部")) { contextMenuStrip.Items.Add(new ToolStripMenuItem("導出全部", null, ExportAllData, "導出全部")); this.ContextMenuStrip = contextMenuStrip; } }
最后調(diào)用的時候就在ExportAllData事件中進行導出即可。
實現(xiàn)效果
到此這篇關(guān)于C# Winform實現(xiàn)導出DataGridView當前頁以及全部數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Winform導出DataGridView數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
WinForm實現(xiàn)仿視頻播放器左下角滾動新聞效果的方法
這篇文章主要介紹了WinForm實現(xiàn)仿視頻播放器左下角滾動新聞效果的方法,涉及WinForm窗口滾動字幕設置的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08C# 中的 IReadOnlyDictionary 和 IReadOnlyLis
C# 中的IReadOnlyDictionary和IReadOnlyList是接口,用于表示只讀的字典和只讀的列表,這些接口提供了對集合的只讀訪問權(quán)限,即不允許對集合進行修改操作,這篇文章主要介紹了C# 中的 IReadOnlyDictionary 和 IReadOnlyList實例詳解,需要的朋友可以參考下2024-03-03C#實現(xiàn)winform用子窗體刷新父窗體及子窗體改變父窗體控件值的方法
這篇文章主要介紹了C#實現(xiàn)winform用子窗體刷新父窗體及子窗體改變父窗體控件值的方法,涉及C#窗體交互的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07