C# Winform实现导出DataGridView当前页以及全部数据

 更新时间:2023年07月18日 10:46:29   作者:Csharp 小记  
基本上,所有的业务系统都会要求有导出的功能,所以这篇文章主要为大家介绍了如何利用Winform实现原生DataGridView的导出功能,需要的可以参考一下

前言

基本上,所有的业务系统都会要求有导出的功能,很多人会选择在每个列表页加入导出按钮进行导出;其实,个人感觉挺麻烦的。不知道有多少用过Dev控件的,Dev的GridView控件自带导出功能有没有觉得很好用?这一篇就动手实现原生DataGridView的导出功能。

实现

1.新建一个自定义控件继承自DataGridView,并在其中定义以下属性

[Description("可导出的最大数量")]
public int ExportMaxCount { get; set; } = 5000;

2.由于是要让DataGridView自带导出控件,所以这里使用右键菜单来做,并在OnCreateControl事件中进行导出的具体实现。

ContextMenuStrip contextMenuStrip = new ContextMenuStrip();
protected override void OnCreateControl()
{
    base.OnCreateControl();
    contextMenuStrip.Items.Add(new ToolStripMenuItem("导出当前页", null, (s, e) =>
            {
                if (Rows.Count == 0)
                {
                    FrmDialog.ShowMessage("没有数据", "提示");
                    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来实现的,具体代码如下,也可参考之前的导出文章

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.到这里,其实就实现了一个公用的带导出功能的DataGridView控件,但是我们一般都会对数据进行分页显示,也会有导出全部的功能,这就要重新去获取服务端的全部数据(这里也可以由后端直接生成提供下载地址)。所以我们在控件中需要增加一个导出全部的事件,如果对事件进行了注册的话,可以在OnMouseDown事件中重新添加一个导出全部的右键菜单,并且可以触发该事件。

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;
            }
        }

最后调用的时候就在ExportAllData事件中进行导出即可。

实现效果

到此这篇关于C# Winform实现导出DataGridView当前页以及全部数据的文章就介绍到这了,更多相关Winform导出DataGridView数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文弄懂C#浅克隆与深克隆

    一文弄懂C#浅克隆与深克隆

    在C#中,浅克隆和深克隆是两种常见的对象克隆技术,本文主要介绍了C#浅克隆与深克隆,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • 利用C#守护Python进程的方法

    利用C#守护Python进程的方法

    这篇文章主要给大家介绍了关于如何利用C#守护Python进程的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • C# OpenCvSharp实现图片批量改名

    C# OpenCvSharp实现图片批量改名

    这篇文章主要为大家详细介绍了C#如何结合OpenCvSharp实现图片批量改名功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • WinForm实现仿视频播放器左下角滚动新闻效果的方法

    WinForm实现仿视频播放器左下角滚动新闻效果的方法

    这篇文章主要介绍了WinForm实现仿视频播放器左下角滚动新闻效果的方法,涉及WinForm窗口滚动字幕设置的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C# 中的 IReadOnlyDictionary 和 IReadOnlyList实例详解

    C# 中的 IReadOnlyDictionary 和 IReadOnlyLis

    C# 中的IReadOnlyDictionary和IReadOnlyList是接口,用于表示只读的字典和只读的列表,这些接口提供了对集合的只读访问权限,即不允许对集合进行修改操作,这篇文章主要介绍了C# 中的 IReadOnlyDictionary 和 IReadOnlyList实例详解,需要的朋友可以参考下
    2024-03-03
  • C#使用whisper.net实现语音识别功能

    C#使用whisper.net实现语音识别功能

    这篇文章主要为大家详细介绍了C#如何使用whisper.net实现语音识别功能,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以学习一下
    2023-11-11
  • C#控件picturebox实现画图功能

    C#控件picturebox实现画图功能

    这篇文章主要为大家详细介绍了C#控件picturebox实现画图功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • C#实现winform用子窗体刷新父窗体及子窗体改变父窗体控件值的方法

    C#实现winform用子窗体刷新父窗体及子窗体改变父窗体控件值的方法

    这篇文章主要介绍了C#实现winform用子窗体刷新父窗体及子窗体改变父窗体控件值的方法,涉及C#窗体交互的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C# List的赋值问题的解决

    C# List的赋值问题的解决

    本文主要介绍了C# List的赋值问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C#实现Ping的方法小结

    C#实现Ping的方法小结

    这篇文章主要介绍了C#实现Ping的方法,以两个实例形式形式较为详细的分析了C#实现ping功能的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08

最新评论