Viewerコントロールのコンテキストメニューを無効化できない
対象製品
ActiveReports for .NET 7.0J
発生環境
Service Pack 2(v7.2.8529.1)の場合に発生します。
状況
修正済み
詳細
※この現象はセクションレポートおよびページレポートの両方で発生します。
Service Pack 1(v7.1.7470.1)以前の場合は、例えば以下のようなコードで、Viewerコントロールを右クリックしたときのコンテキストメニューを無効化できました。
◆サンプルコード(VB.NET)
◆サンプルコード(C#)
しかしながら、Service Pack 2(v7.2.8529.1)を適用した場合、上記のような実装を行っても、Viewerコントロールを右クリックしたときのコンテキストメニューを無効化できません。
Service Pack 1(v7.1.7470.1)以前の場合は、例えば以下のようなコードで、Viewerコントロールを右クリックしたときのコンテキストメニューを無効化できました。
◆サンプルコード(VB.NET)
' コンテキストメニューを無効化します。
Me.viewer1.ContextMenu = New System.Windows.Forms.ContextMenu()
Me.viewer1.ContextMenu = New System.Windows.Forms.ContextMenu()
◆サンプルコード(C#)
// コンテキストメニューを無効化します。
this.viewer1.ContextMenu = new System.Windows.Forms.ContextMenu();
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)
◆サンプルコード(C#)
なお、上記のコードを実装する場合、デザイン時にフォーム上にViewerコントロールを配置する必要はありません。
不具合を修正した最新のサービスパックをご使用ください。
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
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);
}
}
{
・
・
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