将gridview模板字段转换为pdf iTextSharp

时间:2012-06-22 21:42:15

标签: asp.net vb.net gridview itextsharp templatefield

我有一个以编程方式填充的GridView(不是SqlDataSource等)。在格式化文本时,有4列是TemplateFields。它们是Dates和Times,这是他们的TemplateField之一:

<ItemTemplate>
     <asp:Label ID="Label1" Text='<%# FormatDate(Eval("tDate")) %>' runat="server"></asp:Label>
</ItemTemplate>

这是格式化该日期的功能:

Function FormatDate(objTime As Object) As String
    Dim d As String
    If objTime.Equals(DBNull.Value) Then
        d = ""
    Else
        d = Convert.ToDateTime(objTime).ToString("MM-dd-yyyy")
    End If
    Return d
End Function

我一直在使用此Post中的方法,该方法已从this转换为VB代码,以使用iTextSharp将GridView转换为PDF。

我的问题是,在将GridView数据添加到PDF(For For Loops中)时,我在这里得到一个Null Reference异常:

Dim lc As DataBoundLiteralControl = TryCast(gvReport.Rows(rowNo).Cells(colNo).Controls(0), DataBoundLiteralControl)
s = lc.Text.Trim()

如果我删除这个If语句并在这里运行Else部分:

s = gvReport.Rows(rowNo).Cells(colNo).Text.Trim()
ph = New Phrase(s, FontFactory.GetFont("Arial", ReportTextSize, iTextSharp.text.Font.NORMAL))
mainTable.AddCell(ph)

这些日期/时间列在PDF上显示为空,而所有其他列显示没有问题。

我很失落如何解决这个问题,并且在网上找到解决方案却没有成功。

1 个答案:

答案 0 :(得分:0)

虽然我无法修复上面提到的解决方案,但我发现了一种从TemplateField访问数据的不同方法:

Dim s As String = CType(gvReport.Rows(rowNo).FindControl("Label1"), Label).Text

这使我可以访问指定列中的数据。现在我只需要找出迭代遍历行的方法并获取每个不同的TemplateFields,这可能涉及重新处理我的For循环和Select Case语句。