到目前为止,我们可以通过reportviewer将表单varialbe传递给我们的报告。
以下是我们当前的代码,效果很好。
标记
<table>
<tr>
<td align="center" colspan="2">
<asp:Label runat="server" ID="lblUser" Text="Enter UserName" />
</td>
</tr>
<tr>
<td align="center">
UserName: <asp:TextBox runat="server" ID="UserName" Width="75px" />
</td>
<td>
<asp:Button runat="server" ID="btnGetUser" Text="Print" />
</td>
</tr>
</table>
服务器代码:
Sub Run_Report(ByVal sel As String)
ReportViewer1.Reset()
ReportViewer1.LocalReport.DataSources.Clear()
Dim params_user(0) As ReportParameter
Select Case which.Value
Case "R"
ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("DataSet1", ObjectDataSource1.ID))
ReportViewer1.LocalReport.ReportPath = "GetReceits.rdlc"
ReportViewer1.LocalReport.Refresh()
ReportViewer1.LocalReport.EnableExternalImages = True
params_user(0) = New ReportParameter("UserName", UserName.Text, False)
ReportViewer1.LocalReport.SetParameters(params_user)
End Select
End Sub
但是,出于安全原因,我们已要求将会话变量传递给报告。
这样,用户无需输入用户名即可打印报告。
我尝试更改此行:
params_user(0) = New ReportParameter("UserName", UserName.Text, False)
到
params_user(0) = New ReportParameter("UserName", Session("UserName").ToString, False)
但是当我试图运行它时,我得到了:
Object reference not set to an instance of an object.
如何解决此问题?
答案 0 :(得分:0)
如果有效:
params_user(0) = New ReportParameter("UserName", UserName.Text, False)
这会抛出NullReferenceException:
params_user(0) = New ReportParameter("UserName", Session("UserName").ToString, False)
然后似乎Session("UserName")
为空。
该问题的两个解决方案是
Session("UserName")
(如果它为空)或User.Identity.Name
(如果您的用户已经通过某种方式进行了身份验证)。 选项1
在Page_Load代码中,您可以这样做:
If (Session("UserName") Is Nothing) Then
Session("UserName") = "the user name"
End If
选项2
如果您已经对用户进行身份验证,则应该可以传递Page.User.Identity.Name
value:
params_user(0) = New ReportParameter("UserName", User.Identity.Name, False)