【问题标题】:Sql Reporting services - find item in report - on loadSql Reporting 服务 - 在报告中查找项目 - 加载时
【发布时间】:2009-08-10 22:20:43
【问题描述】:

SQL 报告服务在报告查看器的顶部有一个小搜索框。使用时,它会找到搜索文本,导航到包含页面并突出显示页面上的文本。我的问题是当报告加载时我该怎么做。

目前我的页面中嵌入了一个报告查看器。有没有一种方法可以找到?我正在使用 sql 2008 express 和 Dot Net 2

例如,我将序列号 1234 发送到报告,这样当它打开时,它就像用户搜索文本并在报告中为他们找到它一样。


Ed 给了我 url 部分的答案。 http://server/Reportserver?/SampleReports/Product Catalog&rc:FindString=mystring 但我还是搞不懂reportviewer。


以下是部分页面代码:

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();
    }
}

提前致谢。

【问题讨论】:

    标签: c# asp.net sql-server reporting-services


    【解决方案1】:

    参见this MSDN page(SQL 2005 版本,但我相信 2008 版本相同)。

    【讨论】:

      【解决方案2】:

      我在基于 Web 的报表查看器上阅读了许多 MSDN 文章,并尝试了几种方法来启动搜索,但只发现这种方法有效:

      首先,在代码中,您可以像这样设置搜索文本框:

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

      我是在 ReportViewer 的 PreRender 事件中完成的。第一个控件列表中的位置 1 是工具栏控件,#4 是搜索组控件,然后在该组中的第一个控件是文本框。第二个数字 (4) 可能会根据您在工具栏中显示/未显示的内容而有所不同。我正在使用默认报表查看器设置。这是一个 hack,但它有效。

      然后我尝试自己触发搜索事件,但这并没有导致搜索工作,尽管它确实触发了事件并使用正确的信息......

      这就是我所做的。

      我创建了一个javascript函数:

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

      我阅读了 .aspx 页面的源代码并找到了“查找”文本,并弄清楚了客户端调用是什么。您会注意到 ctl01 & ctl04 和 ctl00 遵循与服务器端代码相同的编号。您需要更改它以反映您的代码。同样,第二个 (ctl04) 可能会根据您的工具栏的设置方式而改变。

      然后我将页面正文的 onload 事件设置为 javascript 函数:

      <body onload="OnFirstLoad();">
      

      最后一个技巧是只在第一次调用此代码。所以我在后面的表单代码的页面加载事件中添加了这个:

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

      这会创建一个 JavaScript 函数检查的变量。在第一轮它是假的,所以它调用报告查看器搜索功能,否则它是真的并且不会触发。

      在我看来,这是一个非常糟糕的 hack,而且很脆弱。更改报表查看器的工具栏设置可能需要更改 javascript 和设置文本框的代码。

      我创建了一个有几页的报告,第一次点击直到第三页才开始,它直接进入了它。从那里开始,下一个按钮一直很好,直到报告结束。

      糟糕的是,它不像基于 Windows 的报表查看器或基于服务器的报表查看器那么简单。 :)

      祝你好运!

      【讨论】:

      • 我会试试这个,谢谢。由于赏金,Stackoverflow 在我看到你的答案之前自动接受了 Ed 的答案...grrr。
      【解决方案3】:

      如果您尝试在代码后面的表单中执行此操作,那么您需要找到报表查看器对象并将一个事件添加到实现 Find 的 RenderingComplete,因此如下所示:

      public Report()
      {
          InitializeComponent();
      
      
          rpViewer.RenderingComplete += new RenderingCompleteEventHandler(rpViewer_RenderingComplete);
      
      }
      
      void rpViewer_RenderingComplete(object sender, RenderingCompleteEventArgs e)
      {
          int x = rpViewer.Find("0", 1);
      }
      

      编辑:

      因此,由于这是在网页中,您不能使用 WinForms 控件,但是,我能够使用 klabranche 使用的 Javascript 连接一个较少被黑客入侵的版本。

      这是一个代码隐藏类,它向 html 正文添加了一个 javascript 函数,以在报告中搜索您想要的搜索文本:

      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 + "');");
      }
      

      如果您不将搜索文本添加到文本框中,则它不会在报告的文本框中显示搜索字符串。这也仅适用于一份报告,因此如果您有其他报告,则需要更改此设置。此外,要使其正常工作,您需要更改 html 的正文标记:

      <body id="Body" runat="server">
      

      【讨论】:

      • 我的报表查看器对象似乎没有“查找”方法。我需要的不仅仅是 Microsoft.Reporting.WebForms 参考吗?
      • find 方法在 Microsoft.Reporting.WinForms 中,所以这可能不适合您。你如何显示报告?是在网页上吗?代码是什么样的?
      • 我在问题中添加了代码。如何设置对 Microsoft.Reporting.WinForms 的引用?
      【解决方案4】:

      在您的报告中有一个使用表达式作为背景的文本框,设置如下:

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

      当然,还要创建一个名为 Highlight 的参数。 ;)

      罗伯

      【讨论】:

      • 这是一个非常有趣的解决方案。它可以在许多情况下工作。我的特殊问题是一份 25 页的报告。该项目可能在第 15 页。如果我也可以跳转到该页面(就像 find 那样),那就完美了。
      • 我原以为 ReportViewer 控件会有一个用于提供 FindString 的成员(可以是在 Refresh 命令之后立即调用的方法,也可以是可以预先设置的属性)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      相关资源
      最近更新 更多