2011-06-30 45 views
0

我在Visual Studio 2008中創建了一個水晶報表,它顯示各種股票代碼及其價格。 Crystal Report Viewer的組樹被啓用&顯示股票代碼的列表以便輕鬆導航。組樹中的列表可能會變得很長(100多個股票代碼),這會導致滾動條出現。在水晶報表小組上保持滾動位置

問題是,當用戶從組樹中選擇股票代碼時,頁面回覆&組樹上的滾動位置丟失。這尤其令人沮喪,尤其是當您使用接近列表末尾的股票代碼時。

有什麼方法可以得到組樹的當前滾動位置,保存它&在報表重新加載後重新分配它?

有些事情,我都試過了,但不是很成功:

組樹呈現爲一個div,但沒有一個ID。因此,我使用Report Viewers Controls集合(它是集合中的第4個控件)&檢查了其UniqueID值,從服務器端檢索了Group Tree控件。然後我用它來調用document.getElementById(),但是這總是返回null。 另外,我無法使用從服務器端檢索到的控件,因爲我無法找到類(CrystalDecisions.Web.CrystalReportGroupTree),它是在組樹控件上調用GetType()時提供的類型。

在這個問題上的任何援助將不勝感激。

回答

0

所以我找到了一個很好的解決方案。我用ListBox &創建了自己的「Group Tree」,它位於CrystalReportViewer旁邊,隱藏了觀看者的實際GroupTreeListBox保持其自己的滾動位置以及當前的選擇。這種方法帶來的額外好處是用戶可以使用箭頭鍵導航GroupTree,只要它具有焦點。

我實現的方法如下:

我添加了一個標準ListBox控制&頁它定位到CrystalReportViewer的左側。標記是如下:

<asp:ListBox ID="lstStockCode" runat="server" Width="185px" Height="760px" Font-Size="10pt" AutoPostBack="true" OnSelectedIndexChanged="lstStockCode_SelectedIndexChanged" DataTextField="StockCode" DataValueField="ID" BackColor="#E4E4EC" style="position: relative; top: 30px; border-width: 0px;" Visible="false"></asp:ListBox> 

CrystalReportViewer最初是隱藏的,直到報告準則已選定,此時在視聽者& ListBox將變得可見。

接下來,將ListBox綁定到數據源,該數據源返回與報告綁定的數據相同的數據。在我的情況下,我創建了一個方法來使用與我的報告綁定的存儲過程相同的SQL查詢檢索股票代碼。

最後,在顯示的報告中搜索ListBox中選擇的值。下面是SelectedIndexChanged事件的一個樣本:

protected void lstStockCode_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (ViewState["PrevListIndex"] == null) 
     CrystalReportViewer1.SearchAndHighlightText(lstStockCode.SelectedItem.Text, CrystalDecisions.Shared.SearchDirection.Forward); 
    else if (Convert.ToInt32(ViewState["PrevListIndex"]) < lstStockCode.SelectedIndex) 
     CrystalReportViewer1.SearchAndHighlightText(lstStockCode.SelectedItem.Text, CrystalDecisions.Shared.SearchDirection.Forward); 
    else if (Convert.ToInt32(ViewState["PrevListIndex"]) > lstStockCode.SelectedIndex) 
     CrystalReportViewer1.SearchAndHighlightText(lstStockCode.SelectedItem.Text, CrystalDecisions.Shared.SearchDirection.Backward); 

    ViewState["PrevListIndex"] = lstStockCode.SelectedIndex; 

    CrystalReportViewer1.ToolbarStyle.Width = Unit.Parse("1096px"); 
    lstStockCode.Focus(); 
} 

因爲搜索方向需要爲CrystalReportViewer指定的,我只是存儲我目前的搜索索引&確定我是否搜索進一步下跌,或在報告備份,因爲我的ListBox使用與我的報告&相同的查詢返回,因此它與報告數據的順序相同。

有關此實現的一些感興趣的東西,主要是在樣式方面。所提供的代碼不提供CrystalReportViewer Toolbar的重新定位規定。儘管ListBox與報告一致,但其上面只有Toolbar通常所在的空白。此外,類似TreeView的虛線不會出現在ListBox的內部。我還沒有玩過使用TreeView控件而不是ListBox來達到同樣的效果,但我相信它是非常可行的。

即使看起來這些差異&覺得,客戶並不知道一個新的控制是爲了實現這個目標而建立的。