我有一个从数据库(不是SqlDataSource等)以编程方式填充的GridView。有 4 列是模板字段,因为我格式化了它们的文本。它们是日期和时间,这是他们的模板字段之一:
<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
我一直在使用这篇文章中的方法,该方法已转换为VB代码,以使用iTextSharp将GridView转换为PDF。
我的问题是,在将 GridView 数据添加到 PDF(在 For 循环内)时,我在这里收到空引用异常:
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 上显示为空,而所有其他列显示没有问题。
我对如何解决这个问题感到非常迷茫,并且未能在网上找到解决方案。
虽然我无法修复上面遵循的解决方案,但我找到了一种从模板字段访问数据的不同方法:
Dim s As String = CType(gvReport.Rows(rowNo).FindControl("Label1"), Label).Text
这使我可以访问指定列中的数据。现在我只需要找出一种方法来遍历该行并获取每个不同的模板字段,这可能涉及重新设计我的 For 循环和 Select Case 语句。
你得到Nothing
,因为如果TryCast
无法转换值,它将存储Nothing
。
在绑定列中,控件为 0,但在此类编辑项模板中,控件为 1。
所以你必须改变
Dim lc As DataBoundLiteralControl = TryCast(gvReport.Rows(rowNo).Cells(colNo).Controls(0), DataBoundLiteralControl)
自
Dim lc As Label = TryCast(gvReport.Rows(rowNo).Cells(colNo).Controls(1), Label)