簡體   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