GrapeCity ActiveReports for .NET 14.0J
プレビュー
ActiveReportsユーザーガイド > よくある質問 > セクションレポート > プレビュー

赤い線が表示される

プレビュー時の赤い線は、指定された用紙の幅を示します。指定された用紙の幅よりも、レポート全体の幅が大きい場合に、プレビュー時に赤い線が表示されます。

この赤い線を消すには、レポートの幅(ActiveReportオブジェクトのPrintWidthプロパティ)と左右のマージン(PageSettingsオブジェクトのMargins.Left,Margins.Rightプロパティ)および、とじしろ(PageSettingsオブジェクトのGutterプロパティ)を足した値が、用紙の幅(PrinterオブジェクトのPaperWidthプロパティまたはPaperHeightプロパティ)を超えないようにする必要があります。

つまり、「PageSettings.Margins.Left + PageSettings.Margins.Right + PageSettings.Gutter + PrintWidth <= Document.Printer.PaperWidth(Document.Printer.PaperHeight)」の関係を守る必要があります。

下記の何れかの方法で指定してください。

Visual Basic

Visual Basicコード
コードのコピー
Private Sub SectionReport1_ReportStart(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ReportStart
    If Me.PageSettings.Orientation = PageOrientation.Landscape Then
       ' 用紙が横方向の場合
        Me.PrintWidth = Me.Document.Printer.PaperHeight _
            - (Me.PageSettings.Margins.Left + Me.PageSettings.Margins.Right + Me.PageSettings.Gutter)
    Else
       ' 用紙が縦方向の場合
        Me.PrintWidth = Me.Document.Printer.PaperWidth _
            - (Me.PageSettings.Margins.Left + Me.PageSettings.Margins.Right + Me.PageSettings.Gutter)
    End If
End Sub

C#

C#コード
コードのコピー
private void SectionReport1_ReportStart(object sender, EventArgs e)
{
    if (this.PageSettings.Orientation == PageOrientation.Landscape)
    {
        // 用紙が横方向の場合
        this.PrintWidth = this.Document.Printer.PaperHeight
            - (this.PageSettings.Margins.Left + this.PageSettings.Margins.Right + this.PageSettings.Gutter);
    }
    else
    {
        // 用紙が縦方向の場合
        this.PrintWidth = this.Document.Printer.PaperWidth 
            - (this.PageSettings.Margins.Left + this.PageSettings.Margins.Right + this.PageSettings.Gutter);
    }
}

レポートを生成しながらプレビューする

ViewerのDocumentプロパティにレポートのDocumentインスタンスを設定した上で、Run(True)を実行すると、生成されたページから順次プレビューすることが可能です。

メモ: レポートの構成によっては、上記の方法が適用できない場合があります。たとえば、Summary***プロパティを使って、総ページ数やレポート全体の集計値を出力するという設定をしたTextBoxを配置している場合には、全レコードの処理が完了してから各ページの描画処理が行われるため、ページの生成完了に遅延が発生します。このような場合には、生成されたページから順次プレビューすることはできません。


Visual Basic

Visual Basicコード
コードのコピー
Dim rpt As New SectionReport1
Viewer1.Document = rpt.Document
rpt.Run(True)
                                        

C#

C#コード
コードのコピー
SectionReport1 rpt = new SectionReport1();
this.viewer1.Document = rpt.Document;
rpt.Run(true);
                                                

ただし、生成されたページから順次プレビューする処理を、FormのLoadイベントで実装する場合は注意が必要です。LoadイベントがRunメソッドの完了まで継続し、この間の画面表示が更新されません。このため、Run(True)を実行しても、ビューワに順次レポートが表示されることはありません。

FormのLoadイベントを利用する場合、以下のような方法が考えられます。

  1. スレッドを作成し、別スレッドでレポートの生成を行う

    Visual Basic

    Visual Basicコード
    コードのコピー
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Dim thread As New System.Threading.Thread( _
       New System.Threading.ThreadStart(AddressOf Thread1))
       thread.IsBackground = True
       thread.SetApartmentState(Threading.ApartmentState.STA)
       thread.Start()
    End Sub
    
    Delegate Sub CreateReportDelegate()
    
    Private Sub CreateReport()
      Dim rpt As New SectionReport1
      Viewer1.Document = rpt.Document
      rpt.Run(True)
    End Sub
    
    Private Sub Thread1()
       Me.Viewer1.Invoke(New CreateReportDelegate(AddressOf CreateReport))
    End Sub
    

    C#

    C#コード
    コードのコピー
    private void Form1_Load(object sender, System.EventArgs e)
    {
       System.Threading.Thread thread =
         new System.Threading.Thread(new System.Threading.ThreadStart(Thread1));
       thread.IsBackground = true;
       thread.SetApartmentState(System.Threading.ApartmentState.STA);
       thread.Start();
    }
    
    delegate void CreateReportDelegate();
    
    private void CreateReport()
    {
      SectionReport1 rpt = new SectionReport1();
      this.viewer1.Document = rpt.Document;
      rpt.Run(true);
    }
    
    void Thread1()
    {
      this.viewer1.Invoke(new CreateReportDelegate(CreateReport));
    }
    
  2. Windowsタイマを使用し、Loadイベントの処理を抜けた後に、タイマ・イベントでレポートの生成を行う

    Visual Basic

    Visual Basicコード
    コードのコピー
    Private timer As New Timer()
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    
        ' タイマ・メソッドの作成します。
        AddHandler timer.Tick, New EventHandler(AddressOf CreateReport)
        timer.Interval = 100
    
        ' Loadイベントが終了してから0.1秒後にレポートを生成します。
        timer.Enabled = True
    End Sub
    
    Private Sub CreateReport(ByVal sender As Object, ByVal e As EventArgs)
    
         ' タイマ・メソッドが今後発生しないようにします。
         timer.Enabled = False
    
         ' レポート生成処理。
         Dim rpt As New SectionReport1()
         Me.viewer1.Document = rpt.Document
         rpt.Run(True)
    End Sub
                                                                    
    

    C#

    C#コード
    コードのコピー
    private Timer timer = new Timer();
    private void Form1_Load(object sender, System.EventArgs e)
    {
    
      // タイマ・メソッドの作成します。
       timer.Tick += new EventHandler(CreateReport);
                                     timer.Interval = 100;
    
       // Loadイベントが終了してから0.1秒後にレポートを生成します。
    timer.Enabled = true; } private void CreateReport(object sender, EventArgs e) { // タイマ・メソッドが今後発生しないようにします。 timer.Enabled = false; // レポート生成処理。 SectionReport1 rpt = new SectionReport1(); this.viewer1.Document = rpt.Document; rpt.Run(true); }

.NET Coreデスクトップアプリにおいて、Windowsフォーム用ビューワまたはWPFビューワでスクリプトを含むセクションレポートをプレビューする時、System.NotSupportedException例外が発生する

.NET Coreデスクトップアプリでは、Windowsフォーム用ビューワまたはWPFビューワを使用してスクリプトを含むセクションレポートをプレビューする時、「System.NotSupportedException:1252のエンコードに使用できるデータはありません。」例外が発生します。カスタムエンコーディングを定義する方法については、Encoding.RegisterProviderメソッドを参照してください。

これは、Windowsフォーム用ビューワ、WPFビューワ、およびデザイナを組み込んだ.NET Coreアプリケーションを使用する前に、エンコーディングを登録しないことに関連して発生します。

この事象を回避するには、以下の設定を行ってください。

  1. NuGetパッケージからSystem.Text.Encoding.CodePages.dllアセンブリを追加します。
  2. Program.csにEncoding.RegisterProviderを追加します。
    コードのコピー
    static void Main()
    {
    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new DesignerForm());
    }                                                
    
関連トピック