vb.net - 从 DatagridView 创建 Tiff 位图文件

标签 vb.net winforms datagridview graphics tiff

我想从 Datagridview 创建一个 Tiff 文件。我能够将 Datagridview 获取到 Tiff 文件,但是我只想要行和列,别无其他。

这可能不使用 3rd 方工具吗?

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    DataGridView1.Rows.Add(New String() {"Value1", "Value2", "Value3"})


    Dim height As Integer = DataGridView1.Height
    DataGridView1.Height = DataGridView1.RowCount * DataGridView1.RowTemplate.Height

    Dim bitmap As Bitmap = New Bitmap(Me.DataGridView1.Width - 1, Me.DataGridView1.Height - 1)
    DataGridView1.DrawToBitmap(bitmap, New Rectangle(0, 0, Me.DataGridView1.Width - 1, Me.DataGridView1.Height - 1))

    'Save the Bitmap to folder.
    bitmap.Save("C:Development\DataGridView.Tiff")

End Sub

我不想要突出显示

enter image description here

最佳答案

有几件事情需要考虑:

  • 当控件绘制到位图时,DataGridView 行和列必须可见,
  • 可能存在滚动条,
  • 行的高度可能不同,因此我们必须将所有行的高度相加,
  • 列也一样,因为每列都有自己的宽度,
  • CellFormatting可能已经到位,所以我们需要在绘制之前刷新DataGridView:不可见的行可能还没有格式化,
  • 位图尺寸有限制 (32,767)。

  • 按如下方式调用此方法,指定是否要包含行或列标题或排除两者,传递 True/False ColumnHeaders RowHeaders 论据。
    dgv 参数当然是将要绘制的 DataGridView 控件实例:
    ' Prints the DataGridView including the Columns' Headers only
    Dim dgvBitmap = DataGridViewToBitmap(DataGridView1, True, False)
    Dim imagePath = Path.Combine(AppContext.BaseDirectory, $"{NameOf(DataGridView1)}.tiff")
    dgvBitmap.Save(imagePath, ImageFormat.Tiff)
    
    ' Dispose of the Bitmap or set it as the PictureBox.Image, dispose of it later.  
    dgvBitmap.Dispose()
    
    Private Function DataGridViewToBitmap(dgv As DataGridView, ColumnHeaders As Boolean, RowHeaders As Boolean) As Bitmap
        dgv.ClearSelection()
        Dim originalSize = dgv.Size
        dgv.Height = dgv.Rows.OfType(Of DataGridViewRow).Sum(Function(r) r.Height) + dgv.ColumnHeadersHeight
        dgv.Width = dgv.Columns.OfType(Of DataGridViewColumn).Sum(Function(c) c.Width) + dgv.RowHeadersWidth
        dgv.Refresh()
    
        Dim dgvPosition = New Point(If(RowHeaders, 0, dgv.RowHeadersWidth), If(ColumnHeaders, 0, dgv.ColumnHeadersHeight))
        Dim dgvSize = New Size(dgv.Width, dgv.Height)
        If dgvSize.Height > 32760 OrElse dgvSize.Width > 32760 Then Return Nothing
    
        Dim rect As Rectangle = New Rectangle(Point.Empty, dgvSize)
        Using bmp As Bitmap = New Bitmap(dgvSize.Width, dgvSize.Height)
            dgv.DrawToBitmap(bmp, rect)
            If (dgv.Width > originalSize.Width) AndAlso dgv.ScrollBars.HasFlag(ScrollBars.Vertical) Then
                dgvSize.Width -= SystemInformation.VerticalScrollBarWidth
            End If
            If (dgv.Height > originalSize.Height) AndAlso dgv.ScrollBars.HasFlag(ScrollBars.Horizontal) Then
                dgvSize.Height -= SystemInformation.HorizontalScrollBarHeight
            End If
            dgvSize = New Size(dgvSize.Width - dgvPosition.X, dgvSize.Height - dgvPosition.Y)
    
            dgv.Size = originalSize
            Return bmp.Clone(New Rectangle(dgvPosition, dgvSize), PixelFormat.Format32bppArgb)
        End Using
    End Function
    

    关于vb.net - 从 DatagridView 创建 Tiff 位图文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59631450/

    相关文章:

    c# - 空字符串的怪异情况

    WPF 如何将 mahapps 图标动态对象绑定(bind)到按钮模板样式

    .net - 防止自动选择文本框焦点

    c# - 将自定义列表属性绑定(bind)到 DatagridView

    ASP.Net 网页堆叠 xml 文档而不是并排显示,CSS 问题?

    asp.net - 在 ASP.net 中通过 ID 属性访问服务器端控件

    c#循环遍历组合框,其中数据源是带有文本的数据表

    c# - 具有多列的 WinForms 组合框 (C#)?

    c++ - 数据 GridView 创建

    c# - 如何在 C# 中更改复选框值时计算 DataGridView 中选中的复选框?