[英]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.