Viewerコントロールのコンテキストメニューを無効化できない

文書番号 : 36752     文書種別 : 不具合     登録日 : 2013/11/11     最終更新日 : 2014/04/16
文書を印刷する
対象製品
ActiveReports for .NET 7.0J
発生環境
Service Pack 2(v7.2.8529.1)の場合に発生します。
状況
修正済み
詳細
※この現象はセクションレポートおよびページレポートの両方で発生します。

Service Pack 1(v7.1.7470.1)以前の場合は、例えば以下のようなコードで、Viewerコントロールを右クリックしたときのコンテキストメニューを無効化できました。

◆サンプルコード(VB.NET)
' コンテキストメニューを無効化します。
Me.viewer1.ContextMenu = New System.Windows.Forms.ContextMenu()

◆サンプルコード(C#)
// コンテキストメニューを無効化します。
this.viewer1.ContextMenu = new System.Windows.Forms.ContextMenu();


しかしながら、Service Pack 2(v7.2.8529.1)を適用した場合、上記のような実装を行っても、Viewerコントロールを右クリックしたときのコンテキストメニューを無効化できません。
回避方法
この問題はService Pack 3(v7.3.7964.1)で修正されました。
不具合を修正した最新のサービスパックをご使用ください。

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

以下のように、Viewerを継承し、コンテキストメニューを無効とするようにカスタマイズを行うことで、本事象を回避することが可能です。

◆サンプルコード(VB.NET)
Public Class Form1

  Private CustomizedViewer As GrapeCity.ActiveReports.Viewer.Win.Viewer

  Private Sub Form1_Load(...) Handles MyBase.Load
    ' カスタマイズした Viewer のインスタンスを生成します。
    Me.CustomizedViewer = New CustomizedViewer()

    ' フォーム上にカスタマイズした Viewer を追加します。
    ' ※Dockプロパティを"Fill"に設定しています。

    Me.Controls.Add(Me.CustomizedViewer)
    Me.CustomizedViewer.Dock = DockStyle.Fill

    ' カスタマイズした Viewer にレポートを表示します。
    Me.CustomizedViewer.LoadDocument(New SectionReport1())
  End Sub
End Class

' Viewerを継承してカスタマイズします。
Public Class CustomizedViewer
  Inherits GrapeCity.ActiveReports.Viewer.Win.Viewer
  Private Const WM_CONTEXTMENU As Integer = &H7B

  Protected Overrides Sub WndProc(ByRef m As Message)
    If m.Msg = WM_CONTEXTMENU Then
      Return
    End If

    MyBase.WndProc(m)
  End Sub
End Class

◆サンプルコード(C#)
public partial class Form1 : Form
{
  ・
  ・
  private GrapeCity.ActiveReports.Viewer.Win.Viewer CustomizedViewer;

  private void Form1_Load(object sender, EventArgs e)
  { 
    // カスタマイズした Viewer のインスタンスを生成します。
    this.CustomizedViewer = new CustomizedViewer();

    // フォーム上にカスタマイズした Viewer を追加します。
    // ※Dockプロパティを"Fill"に設定しています。

    this.Controls.Add(this.CustomizedViewer);
    this.CustomizedViewer.Dock = DockStyle.Fill;

    // カスタマイズした Viewer にレポートを表示します。
    this.CustomizedViewer.LoadDocument(new SectionReport1());
  }
}

// Viewerを継承してカスタマイズします。
public class CustomizedViewer : GrapeCity.ActiveReports.Viewer.Win.Viewer
{
  private const int WM_CONTEXTMENU = 0x007B;

  protected override void WndProc(ref Message m)
  {
    if (m.Msg == WM_CONTEXTMENU)
    {
      return;
    }
    base.WndProc(ref m);
  }
}


なお、上記のコードを実装する場合、デザイン時にフォーム上にViewerコントロールを配置する必要はありません。
キーワード
10022