Irf*_*Irf 1 asp.net reportviewer reporting-services ssrs-2008 c#-4.0
我可以看到有很多问题已经被问到同样的事情:
和许多其他人......
但是,我真正想要的是在我开始之前得到你宝贵的意见,最后发现自己处于死胡同!
我们正在BIDS SSRS 2008环境中开发报告,VS 2010用于Web应用程序.与ReportViewer 10一起使用ProcessingMode="Remote"
到目前为止,一切都很好..将参数传递给报告,与asp.net集成等等.我的意思是,通过SQL查询获取数据(有时通过参数过滤).我可以使用存储过程,一切正常.
但现在,有些报告需要根据用户在asp.net网页上从前端(GridView)中选择的数据动态生成,然后在报表上显示该数据.
也就是说,如果用户在GridView上选择10行并单击打印按钮,则只应在报告中显示这10行(以及其他一些报告特定数据).这就是我们现在正在升级的遗留系统中的内容.
当然,这不能仅通过传递参数来实现,因为GridView上的数据选择完全取决于用户,并且都是动态的...我现在正在修理!
那么,对于这些情况,最好的方法是什么?
PS(编辑):有解决方案,但他们更关注.rdlc,我在谈论.rdl
最后我们像下面这样实现它.我想可能对其他人有用.所以发布我的解决方案:
这可以通过XML的实现来完成
首先将您的数据转换为XML,如下所示:
private void ConvertToXml(ref XmlDocument xm)
{
const string header = @"<ENVELOPE>";
var strenvelopes = "";
GridItemCollection selectedRows;
selectedRows = dgAddressList.SelectedItems;
if (selectedRows.Count > 0)
{
foreach (GridItem item in dgAddressList.SelectedItems)
{
strenvelopes += @"<ADDRESS>" +
"<NAME>" + "<![CDATA[" + ((object[])(item.DataItem))[2].ToString() + "]]>" + "</NAME>" +
"<CONTACT>" + "<![CDATA[" + ((object[])(item.DataItem))[1].ToString() + "]]>" + "</CONTACT>" +
"<STREET>" + "<![CDATA[" + ((object[])(item.DataItem))[3].ToString() + "]]>" + "</STREET>" +
"<SUBURBSTATE>" + "<![CDATA[" + ((object[])(item.DataItem))[4].ToString() + "]]>" + "</SUBURBSTATE>" +
"</ADDRESS>";
}
}
const string footer = @"</ENVELOPE>";
var envelopes = header + strenvelopes + footer;
xm.LoadXml(envelopes);
}
Run Code Online (Sandbox Code Playgroud)
您需要替换 ((object[])(item.DataItem))[].ToString()为您自己的值
然后生成您的报告,如下所示:
private void GenerateReport()
{
var xm = new XmlDocument();
ConvertToXml(ref xm);
var xml = xm.InnerXml.ToString();
rptViewer = ucrvEnvelope.FindControl("rptViewer") as ReportViewer;
if (rptViewer != null)
{
rptViewer.ProcessingMode = ProcessingMode.Remote;
rptViewer.ServerReport.ReportServerUrl = new Uri("http://localhost/MyReports");
rptViewer.ServerReport.ReportPath = "/Reporting/rptEnvelope";
rptViewer.PromptAreaCollapsed = true;
}
ReportParameter myParam = new ReportParameter("list", xml);
rptViewer.ServerReport.SetParameters(new ReportParameter[] { myParam });
rptViewer.ShowParameterPrompts = false;
rptViewer.ShowBackButton = true;
rptViewer.ServerReport.Refresh();
}
Run Code Online (Sandbox Code Playgroud)
您应该在报表中添加参数 "list".因为我们将"list"通过以下数据集传递整个XML的东西,
现在将处理这个XML的数据集:
通常,我们所做的是你编写一些存储过程或在数据集中写一些查询,因为我们的是XML,它需要以XML方式处理,
用Query Type: Text写下面的查询来处理在XML数据
DECLARE @docHandle int DECLARE @xmlDocument varchar(max); DECLARE @listXML nvarchar(max)
SET @listXML = @list
SET @xmlDocument = @listXML EXEC sp_xml_preparedocument @docHandle OUTPUT, @xmlDocument
SELECT * FROM OPENXML (@docHandle, N'/ENVELOPE/ADDRESS') WITH
(
NAME nvarchar(max) 'NAME',
CONTACT nvarchar(max) 'CONTACT',
STREET nvarchar(max) 'STREET',
SUBURBSTATE nvarchar(max) 'SUBURBSTATE'
)
Run Code Online (Sandbox Code Playgroud)
田野NAME,CONTACT等要与你创造的东西摆在首位的XML文档一样,在顶部ConvertToXML
所以最重要的是,你没有通过数据库中的strored过程传递数据,但你是从aspx页面中获取数据 - 代码隐藏并将其转换为XML并通过此数据集将其传递给报表服务器报告
所以什么在后面的代码传递给您的报告 .. 瞧!