65.9K
CodeProject 正在变化。 阅读更多。
Home

隐藏 Crystal Report Viewer 的状态栏

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (15投票s)

2003 年 4 月 28 日

2分钟阅读

viewsIcon

159809

downloadIcon

599

隐藏Crystal Report Viewer状态栏的代码。

Screenshot

引言

在.NET中,CyrstalReportViewer控件是一个非常强大的工具。它提供了大多数人所需的基本功能,只有一个例外,那就是:如何隐藏StatusBar?更令人费解的是,可以使用DisplayGroupTreeDisplayToolbar属性分别隐藏分组树和工具栏。但是,DisplayStatusbar属性却找不到。

死胡同

CrystalReportViewer的帮助文档中,应该有一个ViewerStatusBar属性,它获取StatusBar对象。但这在VB.NET或C#中似乎都没有公开。但是,如果您可以获取StatusBar对象,则可以将其Visible属性设置为False,从而将其隐藏。

那么,如何获取StatusBar呢?

更多背景信息

简而言之,CrystalReportViewer控件实际上是五个控件的组合。具体来说:

  1. CrystalDecisions.Windows.Forms.PageView。主窗口。
  2. System.Windows.Forms.Splitter。主窗口和分组树之间的分割器。
  3. CrystalDecisions.Windows.Forms.ReportGroupTree。一个树形视图,允许您深入查看报表。
  4. System.Windows.Forms.ToolBar。顶部的工具栏,允许您执行导出报表、打印等操作。
  5. System.Windows.Forms.StatusBar。我们想要隐藏的状态栏。

答案

因此,知道CrystalReportViewer中实际上有五个控件,我们只需要搜索所有这些控件。找到StatusBar,然后将其Visible属性设置为False。就这么简单!

代码

为了将其设置为UserControl的属性(参见上面的源代码项目),代码如下所示:

Public Property DisplayStatusBar() As Boolean
        Get
            Dim obj As Object
            Dim tempStatusbar As New StatusBar()

            For Each obj In Me.CrystalReportViewer1.Controls
                If obj.GetType Is tempStatusbar.GetType Then
                    Return CType(obj, StatusBar).Visible
                    Exit For
                End If
            Next

            tempStatusbar.Dispose()
            tempStatusbar = Nothing
        End Get
        Set(ByVal Value As Boolean)
            Dim obj As Object
            Dim tempStatusbar As New StatusBar()

            For Each obj In Me.CrystalReportViewer1.Controls
                If obj.GetType Is tempStatusbar.GetType Then
                    CType(obj, StatusBar).Visible = Value
                    Exit For
                End If
            Next

            tempStatusbar.Dispose()
            tempStatusbar = Nothing
        End Set
    End Property

上面的代码并非理想,因为我检查控件类型的唯一方法是创建一个StatusBar的实例,然后将其与GetType方法返回的结果进行比较。理想情况下,代码应该类似于:

     Set(ByVal Value As Boolean)
         Dim obj As Object
         For Each obj In Me.CrystalReportViewer1.Controls
             If obj.GetType Is System.Windows.Forms.StatusBar Then
                 CType(obj, StatusBar).Visible = Value
                 Exit For
             End If
         Next
     End Set

我无法以这种方式实现的原因是obj.GetType Is System.Windows.Forms.StatusBar似乎不兼容(System.Type vs. System.Windows.Forms.Type)。

无论如何,如果有人可以在不创建额外的StatusBar实例的情况下使其工作,我很乐意听到他们的意见。

摘要

我想重复一下,这个实现并不理想。再说一次,我们不得不这样做本身就不理想。希望这篇文章会在.NET的下一个版本甚至Crystal 9中被淘汰,在那里他们可能会默认提供这个属性(希望如此)。但暂时先把这些放在一边,对于在.NET中显示Crystal报表时隐藏StatusBar来说,这是一个很好的解决方法!

我希望这对某些人有所帮助!

© . All rights reserved.