SP4を適用すると、仮想プリンタを使用してレポートをプレビューした時に、ページの右側に赤い線が表示される場合がある

文書番号 : 37632     文書種別 : 不具合     登録日 : 2014/10/17     最終更新日 : 2015/04/08
文書を印刷する
対象製品
ActiveReports for .NET 7.0J
発生環境
Service Pack 4(v7.4.8100.1)の場合に発生します。
状況
修正済み
詳細
※この現象はセクションレポートのみで発生します。

通常、仮想プリンタを使用すると、実行環境上のプリンタから情報を取得しないため、ユーザーが任意で指定した用紙情報でプレビューされます。

◆製品ヘルプ
PowerTools ActiveReports for .NET 7.0J
 - ActiveReportsユーザーガイド
  - 概念
   - セクションレポートの概念
    - 仮想プリンタ

しかしながら、Service Pack 4(v7.4.8100.1)を適用すると、仮想プリンタを使用してレポートをプレビューした時に、用紙サイズがLetterサイズ(幅8.5インチ×高さ11インチ)としてプレビューされてしまいます。

そのため、下記のナレッジベースにもあります通り、レポートの幅(ActiveReportオブジェクトのPrintWidthプロパティ)と左右のマージン(PageSettingsオブジェクトのMargins.Left,Margins.Rightプロパティ)および、とじしろ(PageSettingsオブジェクトのGutterプロパティ)を足した値が、Letterサイズの幅を超える場合、プレビュー時にページの右側に赤い線が表示されてしまいます。

セクションレポートのプレビュー時、ページの右側に赤い線が表示される

なお、本事象はレポートのプレビュー時のみの問題であり、実際にレポートを印刷する場合は、選択したプリンタの任意の用紙サイズで印刷することが可能です。
回避方法
この問題はService Pack 5(v7.5.8161.1)で修正されました。
不具合を修正した最新のサービスパックをご使用ください。

SP5を使用しない場合の回避方法は以下のとおりです。

ViewerのLoadCompletedイベント内で、System.Reflection名前空間を利用してViewerのフィールド情報にアクセスし、実行時に用紙サイズの情報を上書きすることで本事象を回避することが可能です。以下のようなコードになります。

◆サンプルコード(VB.NET)
Imports System.Reflection
Imports GrapeCity.Viewer.Common.ViewModel
Imports GrapeCity.ActiveReports.Viewer.Win

Private Sub Viewer1_LoadCompleted(sender As Object, e As EventArgs) Handles Viewer1.LoadCompleted
  ' Viewer.ViewModelのフィールドを取得します
  Dim field = GetViewerViewModelField()
  If (field Is Nothing) Then
    Return
  End If

  ' 用紙サイズのフィールドを取得します
  Dim prop = GetPaperSizeProperty()
  If (prop Is Nothing) Then
    Return
  End If

  Dim paperSize = New GrapeCity.Viewer.Common.Size(0, 0)
  Dim viewViewModel = CType(field.GetValue(Viewer1), ViewerViewModel)

  ' 用紙サイズの情報を上書きします
  prop.SetValue(viewViewModel.PrimaryReportPane.SinglePageViewModel, paperSize, Nothing)
  prop.SetValue(viewViewModel.PrimaryReportPane.MultiPageViewModel, paperSize, Nothing)
  prop.SetValue(viewViewModel.SecondaryReportPane.SinglePageViewModel, paperSize, Nothing)
  prop.SetValue(viewViewModel.SecondaryReportPane.MultiPageViewModel, paperSize, Nothing)

End Sub

Private Function GetViewerViewModelField() As FieldInfo
  Dim fields = GetType(Viewer).GetFields(BindingFlags.Instance Or BindingFlags.NonPublic)
  For Each field As FieldInfo In fields
    If (field.FieldType Is GetType(ViewerViewModel)) Then
      Return field
    End If
  Next
  Return Nothing
End Function

Private Function GetPaperSizeProperty() As PropertyInfo
  Return GetType(ViewTypeViewModel).GetProperty("PaperSize", BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.Public)
End Function


◆サンプルコード(C#)
using System.Reflection;
using GrapeCity.Viewer.Common.ViewModel;
using GrapeCity.ActiveReports.Viewer.Win;

private void viewer1_LoadCompleted(object sender, EventArgs e)
{
  // Viewer.ViewModelのフィールドを取得します
  var field = GetViewerViewModelField();
  if ((field == null))
  {
    return;
  }

  // 用紙サイズのフィールドを取得します
  var prop = GetPaperSizeProperty();
  if ((prop == null))
  {
    return;
  }

  var paperSize = new GrapeCity.Viewer.Common.Size(0, 0);
  var viewViewModel = (ViewerViewModel)field.GetValue(viewer1);

  // 用紙サイズの情報を上書きします
  prop.SetValue(viewViewModel.PrimaryReportPane.SinglePageViewModel, paperSize, null);
  prop.SetValue(viewViewModel.PrimaryReportPane.MultiPageViewModel, paperSize, null);
  prop.SetValue(viewViewModel.SecondaryReportPane.SinglePageViewModel, paperSize, null);
  prop.SetValue(viewViewModel.SecondaryReportPane.MultiPageViewModel, paperSize, null);
}

private FieldInfo GetViewerViewModelField()
{
  var fields = typeof(Viewer).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
  foreach (FieldInfo field in fields)
  {
    if ((field.FieldType == typeof(ViewerViewModel)))
    {
      return field;
    }
  }
  return null;
}

private PropertyInfo GetPaperSizeProperty()
{
  return typeof(ViewTypeViewModel).GetProperty("PaperSize", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
}
キーワード
10765