Отчеты RDLC: поиск гиперссылок на страницу при отображении в reportViewer

Я новичок в Microsoft reporting stuff и нуждается в помощи! Вот контекст :

Мы формируем отчеты rdlc на основе наборов данных и используем объект reportViewer для его отображения на странице aspx. Нам нужно иметь гиперссылки в отчете, который вызывает другую страницу или веб-службу (еще не решено). Гиперссылки находятся на определенный тип данных внутри ячеек таблицы, позволяет называть их идентификаторами. Страница отчета может содержать много гиперссылок или не содержать их, в зависимости от полученного набора данных.

Пока нет проблем, но вот уловка : нам нужно передать список идентификаторов на страницу/веб-службу, которая содержит все доступные идентификаторы на странице отчета . Поэтому мне нужен способ сканировать страницы формируемого отчета, чтобы получить этот список идентификаторов. Как?

До сих пор я пытался :

  • Определите функцию javascript в aspx, которая будет сканировать DOM отчета для идентификаторов, и вызовите эту функцию в выражении действия «Перейти к url» ячейки таблицы. Javascript выполняется, когда я щелкаю гиперссылку, но функция, определенная на странице aspx, не найдена.
  • Напишите весь javascript для сканирования страницы внутри выражения действия «Перейти к url», но я понял, что, когда я нажимаю на ссылку, javascript выполняется на пустой странице, а не на странице, содержащей мой отчет, поэтому у меня нет доступа к отчету html.

Я хочу попробовать :

  • Скажите клиенту чем это не хорошая идея 🙂
  • Определите функцию javascript на странице aspx и выполните ее после завершения загрузки отчета. Эта функция затем будет сканировать страницу для всех идентификаторов, построить список и asign его к параметру в каждой ссылки на странице отчета. Тем не менее, я предупреждаю, что я могу столкнуться с проблемой безопасности доступа к отчету DOM.

  • Подробнее см. раздел vba «пользовательский код», доступный в свойствах отчета. Это кажется многообещающим, но до сих пор все примеры, которые я видел, где вызов таможенных функций с данными из одной строки набора данных в качестве параметров. Мне нужен доступ ко всем строкам набора данных, содержащимся на формируемой странице.

  • Посмотрите более внимательно на api .Net, чтобы узнать, как набор данных будет распределен по страницам, чтобы я мог создать свои гиперссылки и заменить их перед отправкой на клиентскую сторону.

Проблема, с которой я сталкиваюсь, на самом деле «на страницу». Вы сделали это и как это лучше всего сделать?

Большое спасибо !

EDIT: забыл упомянуть, что все отчеты выполняют группировку кратных данных в наборе данных до отрисовки, поэтому я не могу оценить данные, представленные на странице, подсчитывая x элементов на странице. Это должно быть сделано после того, как набор данных пережеван rdlc…

2 ответа

  1. Я понимаю вашу проблему «на страницу». Решение его javascript способом возможно, у меня не было вашей проблемы

    Javascript выполняется, когда я щелкаю гиперссылку, но функция, определенная на странице aspx, не найдена.

    Скажите мне, если вы хотите исследовать этот путь дальше.

    Мое предпочтительное решение использует другой подход: установите фиксированное количество строк на странице, затем внутри функции пользовательского кода, используя функции Take и Skip Vb вместе с текущим номером страницы, вы можете получить отображаемые строки из большого набора данных. Вы, наконец, используете их в своем действии гиперссылки.

    Я проверил это, и это работает хорошо.
    Вот скриншот и рабочий RDL и соответствующий набор данных (использование того же самого в RDLC должно работать просто отлично)

    * Макет данных из mockaroo.com

  2. Мое другое решение использует DOM-обход с помощью jquery.

    Я добавил заголовок столбца с некоторым текстом крючка (="@HOOK@"), чтобы помочь мне найти таблицу. Вы можете найти другие средства для обнаружения вашей таблицы, если эта не подходит.
    Я также убедился, что заголовок остается видимым во время подкачки.

    Код, проходящий через таблицу, определяется на странице aspx и вызывается с помощью go to url using ="javascript:functionName()"

    Скриншот рабочего примера (спросите меня, хотите ли вы, чтобы я загрузил рабочий проект)

    Решение :

    страница 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>
    

    Перейти к действию url

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