【问题标题】:Getting OutOfRange exception when trying to insert values from datagridview into PDFtable尝试将 datagridview 中的值插入 PDFptable 时出现超出范围异常
【发布时间】:2013-12-24 15:05:23
【问题描述】:

我有一个我正在尝试以 pdf 格式导出的 datagridview。我下载并实现了一个 datagridviewtopdf 类,但我需要对其进行修改以动态创建必要的列(一年中的几个月,列数的范围为 1-12)。我还需要包含一个额外的列来将每一行的行标题文本放在我的 datagridview 中。我有代码,我将在下面包含。在我出演的那一行中,我不断收到 OutOfRange 异常。知道如何解决这个问题并创建类似于我的 datagridview 表的 pdf 吗?

编辑后还包括 datagridview 的屏幕截图。 Datagridview 将有最多 65 行和最多 12 列(不包括行标题或列标题

  Private Function GetDataTable() As System.Data.DataTable
    Dim dataTable As New Data.DataTable("MyDataTable")
    'Create another DataColumn Name
    For column As Integer = 1 To DataGridView1.ColumnCount - 1
        Dim dataColumn_1 As New DataColumn(DataGridView1.Columns(column).HeaderText.ToString(), GetType(String))
        dataTable.Columns.Add(dataColumn_1)
        'Now Add some row to newly created dataTable
        Dim dataRow As DataRow
        For i As Integer = 0 To DataGridView1.Rows.Count - 1
            dataRow = dataTable.NewRow()
            ' Important you have create New row
            dataRow(DataGridView1.Columns(column).HeaderText.ToString()) = DataGridView1.Rows(i).Cells(column).Value.ToString()
            dataTable.Rows.Add(dataRow)
        Next i
    Next column
    dataTable.AcceptChanges()
    Return dataTable
End Function

Private Sub ExportDataToPDFTable()
    Dim paragraph As New Paragraph
    Dim doc As New Document(iTextSharp.text.PageSize.A4, 40, 40, 40, 10)
    Dim wri As PdfWriter = PdfWriter.GetInstance(doc, New FileStream(SaveFileDialog1.FileName + ".pdf", FileMode.Create))
    doc.Open()

    Dim font12BoldRed As New iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.TIMES_ROMAN, 12.0F, iTextSharp.text.Font.UNDERLINE Or iTextSharp.text.Font.BOLDITALIC, BaseColor.RED)
    Dim font12Bold As New iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.TIMES_ROMAN, 12.0F, iTextSharp.text.Font.BOLD, BaseColor.BLACK)
    Dim font12Normal As New iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.TIMES_ROMAN, 12.0F, iTextSharp.text.Font.NORMAL, BaseColor.BLACK)

    Dim p1 As New Phrase
    p1 = New Phrase(New Chunk("PDF From Datagridview Data", font12BoldRed))
    doc.Add(p1)

    'Create instance of the pdf table and set the number of column in that table
    Dim PdfTable As New PdfPTable(DataGridView1.ColumnCount + 1)
    PdfTable.TotalWidth = 490.0F
    'fix the absolute width of the table
    PdfTable.LockedWidth = True
    'relative col widths in proportions - 1,4,1,1 and 1
    'Dim widths As Single() = New Single() {1.0F, 1.0F, 1.0F, 1.0F, 1.0F}
    ' PdfTable.SetWidths(widths)
    PdfTable.HorizontalAlignment = 1 ' 0 --> Left, 1 --> Center, 2 --> Right
    PdfTable.SpacingBefore = 2.0F

    'pdfCell Decleration
    Dim PdfPCell As PdfPCell = Nothing
    'Assigning values to each cell as phrases
    For column As Integer = 0 To (DataGridView1.ColumnCount - 1)
        If column = 0 Then
            For row As Integer = 0 To (DataGridView1.RowCount - 1)
                'Getting out of range exception below for row
                PdfPCell = New PdfPCell(New Phrase(New Chunk(DataGridView1.Rows(row).HeaderCell.ToString, font12Bold)))
                'Add pdfcell in pdftable
                PdfTable.AddCell(PdfPCell)
            Next row

        Else
            PdfPCell = New PdfPCell(New Phrase(New Chunk(DataGridView1.Columns(column).HeaderText, font12Bold)))
            'Alignment of phrase in the pdfcell
            PdfPCell.HorizontalAlignment = PdfPCell.ALIGN_CENTER

            'Add pdfcell in pdftable
            PdfTable.AddCell(PdfPCell)
        End If


    Next column


    Dim dt = GetDataTable()
    If dt IsNot Nothing Then
        'Now add the data from datatable to pdf table
        For rows As Integer = 0 To dt.Rows.Count - 1
            For column As Integer = 0 To dt.Columns.Count - 1
                PdfPCell = New PdfPCell(New Phrase(dt.Rows(rows)(column).ToString(), font12Normal))
                If column = 0 Or column = 1 Then
                    PdfPCell.HorizontalAlignment = PdfPCell.ALIGN_LEFT
                Else
                    PdfPCell.HorizontalAlignment = PdfPCell.ALIGN_RIGHT
                End If
                PdfTable.AddCell(PdfPCell)
            Next
        Next
        'Adding pdftable to the pdfdocument
        doc.Add(PdfTable)
    End If
    doc.Close()
End Sub

【问题讨论】:

    标签: vb.net datagridview itext pdf-generation


    【解决方案1】:

    变化:

    For column As Integer = 1 To DataGridView1.ColumnCount + 1
    For row As Integer = 1 To DataGridView1.RowCount
    

    收件人:

    For column As Integer = 0 To (DataGridView1.ColumnCount - 1)
    For row As Integer = 0 To (DataGridView1.RowCount -1)
    

    记住:这是零基索引。

    例子:

    Dim dtColumn As DataColumn
    Dim dtRow As DataRow
    
    For column As Integer = 0 To (Me.DataGridView1.ColumnCount - 1)
        dtColumn = dt.Columns.Item(Me.DataGridView1.Columns(column).DataPropertyName)
        For row As Integer = 0 To (DataGridView1.RowCount - 1)
            dtRow = DirectCast(Me.DataGridView1.Rows(row).DataBoundItem, DataRowView).Row
    
            'Replace this:
            'PdfPCell = New PdfPCell(New Phrase(dt.Rows(rows)(column).ToString(), font12Normal))
    
            'With this:
            PdfPCell = New PdfPCell(New Phrase(row.Item(column).ToString(), font12Normal))
    
        Next
    Next
    

    【讨论】:

    • 我做到了,它不再让人期待(顺便谢谢你)。但是,与实际的 datagridview 相比,现在我的 PDF 表格仍然很有趣。这是link,用于查看 PDF 表外观的快照(这是我上面包含的第二个 datagridview 表)。你认为你可以帮我修改我的 pdf 输出代码以使 pdf 表类似于 datagridview 表吗?
    • 1.此行指的是第二列:If column = 1 Then。 2. 您应该永远假设 DataGridView 列/行索引与数据源匹配。 PdfPCell = New PdfPCell(New Phrase(dt.Rows(rows)(column).ToString(), font12Normal))
    • 在您的循环中执行以下操作:Dim dtColumn As DataColumn = dt.Columns.Item(Me.DataGridView1.Columns(column).Name)Dim dtRow As DataRow = DirectCast(Me.DataGridView1.Rows(row).DataBoundItem, DataRowView).Row
    • 能否提供插入的代码?我不知道该放在哪里或如何放置
    • 首先,尝试将If column = 1 Then 替换为If column = 0 Then
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    相关资源
    最近更新 更多