繁体   English   中英

Sql Reporting服务 - 在报告中查找项目 - 加载时

[英]Sql Reporting services - find item in report - on load

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

目前我的页面中嵌入了一个reportviewer。 有没有找到的方法? 我使用的是sql 2008 express和Dot Net 2

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


艾德给了我网址部分的答案。 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();
    }
}

提前致谢。

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

我在基于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页面的来源,找到了文本“find”并找出了客户端调用的内容。 您会注意到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和代码以设置文本框。

我创建了一个包含多个页面的报告,第一次点击直到第三页才直接进入。 从那里开始,下一个按钮效果很好,直到报告结束。

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

祝好运!

如果您尝试在代码后面的表单中执行此操作,则需要查找报表查看器对象并向实现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连接一个较少被黑客攻击的版本。

这是一个类后面的代码,它将一个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">

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

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

当然,制作一个名为Highlight的参数。 ;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM