【问题标题】:RDLC reports : find hyperlinks per page when displayed in reportViewerRDLC 报告:在 reportViewer 中显示时查找每页的超链接
【发布时间】:2017-03-19 06:39:37
【问题描述】:

我是 Microsoft 报告方面的新手,需要一些帮助!这是上下文:

我们正在基于数据集格式化 rdlc 报告,并使用 reportViewer 对象将其显示在 aspx 页面中。我们需要在报告中包含调用另一个页面或 Web 服务的超链接(尚未确定)。超链接位于表格单元格内的特定类型的数据上,我们称它们为 ID。一个报告页面可以包含许多超链接,也可以不包含超链接,具体取决于获得的数据集。

到目前为止没有问题,但有一个问题:我们需要将一个 ID 列表传递给页面/Web 服务,该列表包含报告页面中的所有可用 ID。所以我需要一种方法来扫描格式化报告的页面以获取该 ID 列表。怎么样?

到目前为止,我尝试过:

  • 在 aspx 中定义一个 javascript 函数,该函数将扫描报告 DOM 中的 ID,并在表格单元格的“转到 url”操作表达式中调用此函数。单击超链接时执行了javascript,但未找到aspx页面中定义的函数。
  • 编写所有的javascript来扫描页面里面的“go to url”动作的表达,但是我意识到当我点击链接时,javascript是在一个空白页面中执行的,而不是在包含我的报告的页面中,所以我无权访问报告 html。

我想试试:

  • 告诉客户这不是一个好主意:)
  • 在aspx页面中定义一个javascript函数,当报表加载完成时执行。然后,此函数将扫描页面中的所有 ID,构建一个列表并将其分配给报告页面中每个链接中的参数。但是,我担心访问报告 DOM 时可能会遇到安全问题。

  • 更仔细地查看报告属性中可用的 vba“自定义代码”部分。这似乎很有希望,但到目前为止,我看到的所有示例都使用来自单个数据集行的数据作为参数调用海关函数。我需要访问格式化页面中包含的所有数据集行。

  • 更仔细地查看 .Net api,看看我是否可以了解数据集将如何分布在页面上,这样我就可以构建超链接并在发送到客户端之前替换它们。

我面临的问题实际上是“每页”问题。你这样做了吗?最好的方法是什么?

非常感谢!

编辑: 忘了提及所有报告在渲染之前对数据集执行倍数分组,因此我无法通过计算每页的 x 个元素来估计页面中呈现的数据。需要在数据集被rdlc咀嚼之后再做...

【问题讨论】:

    标签: c# asp.net reporting-services rdlc reportviewer


    【解决方案1】:

    我的其他解决方案使用 jquery 进行 dom 遍历。

    我添加了一个带有一些钩子文本的列标题 (="@HOOK@") 来帮助我找到表格。如果该方法不合适,您可以找到其他方法来检测您的表。 I also made sure header stays visible during paging.

    遍历表的代码在 aspx 页面中定义,并使用 go to url using ="javascript:functionName()" 调用

    Screenshot of working example(问我要不要上传工作项目)

    解决方案:

    aspx 页面

    <form runat="server">
    <asp:scriptmanager runat="server"></asp:scriptmanager>
        Your aspx page : 
        <rsweb:ReportViewer ID="ReportViewer1" runat="server" Font-Names="Verdana" Font-Size="8pt" WaitMessageFont-Names="Verdana" WaitMessageFont-Size="14pt" Height="585px" Width="1007px">
    
            <LocalReport EnableHyperLinks="true" ReportPath="Report1.rdlc">
                <DataSources>
                    <rsweb:ReportDataSource Name="DataSet1" DataSourceId="ObjectDataSource1"></rsweb:ReportDataSource>
                </DataSources>
            </LocalReport>
        </rsweb:ReportViewer>
    
        <asp:objectdatasource runat="server" selectmethod="GetData" typename="stackOverFlow1.ToolsDataSetTableAdapters.MOCK_DATATableAdapter" id="ObjectDataSource1"></asp:objectdatasource>
    </form>
    <script>
        function getCurrentIds() {
            //get latest table containing my hook
            var data = $("table:contains('@HOOK@')").eq(-1).find("tr").map(function (index) {
                if (index > 1) {
                    $row = $(this);
                    //hide the hook and find the contents of the second td
                    $row.find("td:first").hide();
                    var id = $row.find("td:nth-of-type(2)").text();
                    // console.log(id);
                    return id;
                }
            }).get();
            return data.join(",");
        }
    </script>
    

    转到网址操作

    ="javascript:alert('current page ids using javascript :' + getCurrentIds())"
    

    【讨论】:

    • 感谢您的时间和努力!您演示的 ReportViewer 内部链接可以执行包含在 aspx 页面中的 javascript 函数,这正是我所需要的。
    • 谢谢,很高兴您得到了解决方案!
    【解决方案2】:

    我了解您的“每页”问题。用javascript方式解决是可能的,我没有遇到你的问题

    点击超链接时执行了javascript,但是没有找到aspx页面中定义的函数。

    如果您想进一步调查此路径,请告诉我。

    我首选的解决方案使用不同的方法:设置每页的固定行数,然后在自定义代码函数中,使用 Vb Take 和 Skip 函数以及当前页码,您可以从大数据集中获取当前显示的行.您最终在超链接操作中使用它们。

    我对此进行了测试,它工作正常。 Here's a screenshot the working RDL and corresponding dataset(在 RDLC 中使用相同的东西应该可以正常工作)

    * 来自 mockaroo.com 的模拟数据

    【讨论】:

    • 感谢 Yassine 的回答。不幸的是,报告都在数据集上执行多个分组,因此我无法在报告格式化之前扫描数据集以定义超链接。我将编辑我的问题以提及它。
    • 我的意思是“找不到在 aspx 页面中定义的函数”是“转到 url”操作将定义的表达式视为在空白选项卡中打开的 url,所以表达式中定义的 javascript 在此空白选项卡中执行...
    • 我的解决方案不涉及“之前”的数据操作,它实际上是在报表内部完成的,看看报表自定义代码。但无论如何,看看第二个javascript解决方案。
    • 谢谢!我将为您的 javascript 解决方案授予您赏金,但您能否详细说明如何在自定义代码中“从大数据集中获取当前显示的行”?正如我所提到的,我看到的所有示例都接收单个值作为参数。如果可能的话,我会支持 vb 自定义代码选项...
    • 我认为通过足够的试验和错误,您可以设法将多值参数作为函数的参数,我给您的示例,我创建了一个从数据集中获取数据的报告参数(默认值来自数据集)。