所以我找到了一個很好的解決方案。我用ListBox
&創建了自己的「Group Tree」,它位於CrystalReportViewer
旁邊,隱藏了觀看者的實際GroupTree
。 ListBox
保持其自己的滾動位置以及當前的選擇。這種方法帶來的額外好處是用戶可以使用箭頭鍵導航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
來達到同樣的效果,但我相信它是非常可行的。
即使看起來這些差異&覺得,客戶並不知道一個新的控制是爲了實現這個目標而建立的。