【问题标题】:Save whole of DataGridView as an Image将整个 DataGridView 保存为图像
【发布时间】:2019-04-27 22:47:43
【问题描述】:

我需要将整个 DataGridView 保存为图像。
我在网上看到过一些帖子,但它对我不起作用。
到目前为止,我已经尝试了这两个链接:

DataGridView to BimapSave Image in folder

我的意图是一旦按下按钮,DataGridView 将被转换为图像并自动保存到桌面。

我使用的代码会产生错误:

GDI+ 中发生一般错误

     private void button1_Click(object sender, EventArgs e) 
    {
        //Resize DataGridView to full height.
        int height = dataGridView1.Height;
        dataGridView1.Height = dataGridView1.RowCount * dataGridView1.RowTemplate.Height;

        //Create a Bitmap and draw the DataGridView on it.
        Bitmap bitmap = new Bitmap(this.dataGridView1.Width, this.dataGridView1.Height);
        dataGridView1.DrawToBitmap(bitmap, new Rectangle(0, 0, this.dataGridView1.Width, this.dataGridView1.Height));

        //Resize DataGridView back to original height.
        dataGridView1.Height = height;

        //Save the Bitmap to folder.

       bitmap.Save(@"C:\\Desktop\\datagrid.jpg");
    }

希望能得到一些帮助。谢谢!

【问题讨论】:

  • 除了其他的注意事项之外,请注意,这仅在位图的两个维度都

标签: c# winforms datagridview graphics bitmap


【解决方案1】:

尝试将bitmap.Save(@"C:\\Desktop\\datagrid.jpg"); 替换为:

File.WriteAllBytes(@"C:\\Desktop\\datagrid.jpg", (byte[])new ImageConverter().ConvertTo(bitmap, typeof(byte[])));

【讨论】:

    【解决方案2】:

    试试这个

    图片保存文件路径,如“C:\Users\User\Desktop\datagrid.jpg

    bitmap.Save(@"C:\Users\User\Desktop\datagrid.jpg");
    

    【讨论】:

    • 嗨 Dhanushka。如果只有一行,您的方法能够将 datagridview 完全保存为图像。如果有两行或更多行,则从第 2 行开始的列将被阻塞。不过,我也感谢您的帮助。谢谢!
    【解决方案3】:

    您需要修复多个代码部分:

    1. bitmap.Save(@"C:\\Desktop\\datagrid.jpg");。此路径字符串应为:
      @"C:\Users\SomeUser\Desktop\datagrid.jpg"
      "C:\\Users\\SomeUser\\Desktop\\datagrid.jpg"。见第 6 点。
    2. 在计算 DataGridView 高度时,您不包括网格标题。
    3. 创建Bitmap 对象时,该对象必须像您创建的任何其他一次性对象一样被丢弃。您可以使用Bitmap.Dispose() 方法或将您的对象包含在Using 块中。
    4. Bitmap.Save([Path]),不指定ImageFormat,创建PNG 图像。不考虑您在路径字符串中插入的文件扩展名。此时,您正在创建一个扩展名为 .jpg 的文件,而它实际上是一个 .png 文件。
    5. 保存此类位图时,应使用Png 格式,而不是Jpeg。它的无损压缩更贴切:它将保留图像颜色并提高整体质量。
    6. 当前用户桌面的路径不应被硬编码。此路径由Environment.SpecialFolder.Desktop 返回。

    您可以按如下方式修改您的代码:

    using System.IO;
    
    private void button1_Click(object sender, EventArgs e)
    {
        int DGVOriginalHeight = dataGridView1.Height;
        dataGridView1.Height = (dataGridView1.RowCount * dataGridView1.RowTemplate.Height) + 
                                dataGridView1.ColumnHeadersHeight;
    
        using (Bitmap bitmap = new Bitmap(this.dataGridView1.Width, this.dataGridView1.Height))
        {
            dataGridView1.DrawToBitmap(bitmap, new Rectangle(Point.Empty, this.dataGridView1.Size));
            string DesktopFolder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            bitmap.Save(Path.Combine(DesktopFolder, "datagridview1.png"), ImageFormat.Png);
        }
        dataGridView1.Height = DGVOriginalHeight;
    }
    

    【讨论】:

    • 这一行` bitmap.Save(Path.Combine(DesktopFolder, "datagridview1.png"), ImageFormat.Png); }` 是 `bitmap.Save(Path.Combine(DesktopFolder, "\\datagridview1.png"), ImageFormat.Png); }
    • @preciousbetine 一点也不。这是Path.Combine 的工作。请参阅文档。
    • 好的,我以为你在使用其他方法来连接两条路径,请阅读Path.Combine 方法,非常感谢。
    • 嗨,吉米。非常感谢您的指点。您的代码显着改善了最终输出。 :)
    • @masyita shariff 我很高兴听到这个消息 :)
    猜你喜欢
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多