Sql Reporting services - найти элемент в отчете - под нагрузкой - PullRequest
3 голосов
/ 11 августа 2009

Службы отчетов SQL имеют небольшое окно поиска в верхней части окна просмотра отчетов. При использовании он находит искомый текст, переходит на содержащую страницу и выделяет текст на странице. У меня вопрос, как я могу сделать это при загрузке отчета.

В настоящее время у меня есть встроенная программа просмотра отчетов на моей странице. Есть ли способ, который найдет? Я использую SQL 2008 Express и Dot Net 2

Например, я отправляю в отчет серийный номер 1234, чтобы при его открытии он действовал так, как если бы пользователь искал текст и нашел его в отчете.


Эд дал мне ответ на часть URL. http://server/Reportserver?/SampleReports/Product Catalog&rc:FindString=mystring но я все еще не могу понять, кто просматривает отчеты.


Вот часть кода страницы:

using Microsoft.Reporting.WebForms; 

protected void Page_Load(object sender, EventArgs e)

{
    if (!Page.IsPostBack)
    {
        Int32 iID = Convert.ToInt32(Request.QueryString["ID"]);
        String reportsPath = ConfigurationManager.AppSettings["ReportsPath"];
        String sReportName = "ReportInvoice";

        reportViewer1.Reset();
        reportViewer1.ProcessingMode = ProcessingMode.Remote;
        reportViewer1.ShowParameterPrompts = false;
        reportViewer1.ServerReport.ReportServerUrl = new Uri(ConfigurationManager.AppSettings["ReportViewerUrl"]);
        reportViewer1.ServerReport.ReportServerCredentials = new ReportServerCredentials();//http://localhost/reportserver
        reportViewer1.AsyncRendering = false;
        ReportParameter[] reportParams = new ReportParameter[1];
        reportViewer1.ServerReport.ReportPath = reportsPath + sReportName;
        reportParams[0] = new ReportParameter("invoiceID", iID.ToString());
        reportViewer1.ServerReport.Refresh();
    }
}

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 28 августа 2009

Я прочитал много статей MSDN в веб-средстве просмотра отчетов и попробовал несколько способов, чтобы отключить поиск, но нашел только один из них:

Во-первых, в коде вы можете установить текстовое поле поиска следующим образом:

    TextBox txt;
    txt = (TextBox) this.ReportViewer1.Controls[1].Controls[4].Controls[0];        
    txt.Text = "test";

Я сделал это в событии PreRender ReportViewer. Позиция 1 в первом списке элементов управления - это элемент управления панели инструментов, # 4 - элемент управления группы поиска, а затем в этой группе первым элементом управления является текстовое поле. Второе число (4) может варьироваться в зависимости от того, что вы показываете / не показывает на панели инструментов. Я работал с настройками просмотра отчетов по умолчанию. Это взлом, но это работает.

Затем я попытался запустить событие поиска самостоятельно, но это не привело к тому, что поиск работал, хотя он и включил событие с правильной информацией ....

Итак, вот что я сделал.

Я создал функцию JavaScript:

<script type="text/javascript">
    function OnFirstLoad() {
        if (!isPostBack)
            document.getElementById('ReportViewer1').ClientController.ActionHandler('Search', document.getElementById('ReportViewer1_ctl01_ctl04_ctl00').value);
    }
</script>

Я прочитал источник страницы .aspx, нашел текст «find» и выяснил, что был вызов на стороне клиента. Вы заметите, что ctl01 & ctl04 и ctl00 следуют той же нумерации, что и код на стороне сервера. Вам необходимо изменить это, чтобы отразить ваш код. Опять же, второй (ctl04) - тот, который может меняться в зависимости от того, как настроена ваша панель инструментов.

Затем я устанавливаю событие загрузки для тела страницы в функцию javascript:

<body onload="OnFirstLoad();">

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

If (!IsPostBack)
    ClientScript.RegisterClientScriptBlock(GetType(), "IsPostBack", "var isPostBack = false;", true);
else
    ClientScript.RegisterClientScriptBlock(GetType(), "IsPostBack", "var isPostBack = true;", true);

Это создает переменную, которую проверяет функция javascript. При первом обходе он ложный, поэтому он вызывает функцию поиска в средствах просмотра отчетов, в противном случае он равен true и не срабатывает.

Это довольно плохой хак на мой взгляд и хрупкий. Для изменения настроек панели инструментов средства просмотра отчетов могут потребоваться изменения JavaScript и кода для установки текстового поля.

Я создал отчет, состоящий из нескольких страниц, и первый удар пришелся только на третью страницу, и он пошел прямо к нему. Оттуда следующая кнопка прекрасно работала до конца отчета.

К сожалению, это не так просто, как просмотрщик отчетов на основе окон или серверный просмотрщик отчетов. :)

Удачи!

2 голосов
/ 11 августа 2009

См. на этой странице MSDN (версия SQL 2005, но, как мне кажется, версия 2008 года такая же).

1 голос
/ 27 августа 2009

Если вы пытаетесь сделать это в форме кода, то вам нужно найти объект средства просмотра отчетов и добавить событие в RenderingComplete, который реализует Find, так что-то вроде этого:

public Report()
{
    InitializeComponent();


    rpViewer.RenderingComplete += new RenderingCompleteEventHandler(rpViewer_RenderingComplete);

}

void rpViewer_RenderingComplete(object sender, RenderingCompleteEventArgs e)
{
    int x = rpViewer.Find("0", 1);
}

EDIT:

Итак, поскольку на этой веб-странице вы не можете использовать элементы управления WinForms, я смог подключить чуть менее взломанную версию, используя Javascript, который использовал klabranche.

Вот код класса, который добавляет функцию javascript к телу html для поиска в отчете искомого текста:

private void SearchReport(ReportViewer rv, string SearchText)
{
    TextBox txt = (TextBox)rv.Controls[1].Controls[4].Controls[0];
    txt.Text = SearchText;
    this.Body.Attributes.Add("onload", "javascript:document.getElementById('" + rv.ClientID + 
        "').ClientController.ActionHandler('Search', '" + SearchText + "');");
}

Если вы не добавите текст поиска в текстовое поле, тогда строка поиска не будет отображаться в текстовом поле отчета. Это также работает только для одного отчета, поэтому если у вас есть дополнительные отчеты, вам нужно изменить это. Кроме того, чтобы это работало, вам нужно изменить тег body вашего html:

<body id="Body" runat="server">
0 голосов
/ 27 августа 2009

В вашем отчете должно быть текстовое поле, которое использует выражение для фона, установите что-то вроде:

=iif(me.value = Parameters!Highlight.value, "Yellow", "White")

И, конечно, создайте параметр с именем Highlight. ;)

Rob

...