2009-08-10 62 views
3

SQL报告服务在报告查看器的顶部有一个小小的搜索框。使用时,它会查找搜索文本,导航到包含页面并突出显示页面上的文本。我的问题是,如何在报告加载时执行此操作。Sql报告服务 - 查找报告中的项目 - 正在加载

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

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


埃德给了我对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(); 
    } 
} 

在此先感谢。

回答

2

请参阅this MSDN page(SQL 2005版本,​​但2008年是相同的,我相信)。

0

有报表中的文本框,使用它的背景表达,设置是这样的:

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

,当然还有,做一个叫高亮参数。 ;)

罗布

+0

这是一个非常有趣的解决方案。它会在很多情况下工作。我的特别报告是一个25页的报告。该项目可能在第15页。如果我也可以跳转到页面(比如find),那将是完美的。 – Praesagus 2009-08-27 17:13:55

+0

我以为ReportViewer控件会有一个用于提供FindString的成员(您可以在Refresh命令后立即调用Method,或者可以事先设置Property)。 – 2009-08-28 00:09:49

1

如果你想做到这一点,在代码的形式背后,那么你需要找到报表查看器对象,并添加一个事件来实现查找RenderingComplete,所以是这样的:

public Report() 
{ 
    InitializeComponent(); 


    rpViewer.RenderingComplete += new RenderingCompleteEventHandler(rpViewer_RenderingComplete); 

} 

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

编辑:

所以,因为这在网页中不能使用的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 + "');"); 
} 

如果没有搜索文本添加到文本框,那么它不会在报告的文本框中显示搜索字符串。这也只适用于一个报告,所以如果你有额外的报告,你需要改变这一点。另外,对于这个工作,你需要改变你的HTML的body标签:

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

我的报表查看器对象似乎没有“查找”方法。我需要比Microsoft.Reporting.WebForms参考更多吗? – Praesagus 2009-08-27 18:50:44

+0

查找方法在Microsoft.Reporting.WinForms中,因此这可能对您无效。你如何显示报告?它在网页上吗?代码是什么样的? – Noah 2009-08-28 00:09:35

+0

我在代码中添加了代码。我如何设置对Microsoft.Reporting.WinForms的引用? – Praesagus 2009-09-01 16:57:51

2

我经历了很多的基于Web的报表查看MSDN文章的阅读和尝试了几种方法来断火的搜索,但只发现这一工作:

首先,在代码中你可以设置搜索文本框,如下所示:

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

我做到了在中的ReportViewer的PreRender事件。第一个控制列表中的位置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页面的源代码,发现文本“发现”并想出什么客户端调用了。您会注意到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函数检查的变量。在第一轮中它是错误的,因此它调用报告查看器搜索功能,否则它是真的并且不会触发。

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

我创建了一个报告,有几个页面,第一次打到第三页,直到它。从那里,下一个按钮的工作效果很好,直到报告结束。

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

祝你好运!

+0

我会试试这个,谢谢。 Stackoverflow自动接受了埃德的答案,然后我才看到你的因为赏金...... grrr。 – Praesagus 2009-08-28 23:49:31