右クリックメニューをセル毎に割り当てるには?
対象製品
El Tabelle for .NET
詳細
El Tabelle の Sheet には、右クリックメニューを割り当てるための ContextMenu プロパティが備えられています。ContextMenu プロパティに .NET Framework の ContextMenu コントロールを割り当てることで右クリックメニューを表示できます。
しかし、このプロパティはシートに対して割り当てられるもので、ユーザーが選択しているセルの内容に応じてメニューを変更したい場合には不十分です。また、El Tabelle の既定の動作では、右クリックでセルが選択されません。
右クリックでセルを選択し、さらにセルに応じたメニューを表示するには、Sheet の MouseDown イベントに次のようにコーディングします。
※ イベント ハンドラのコードは Visual Studio .NET で生成してください。
[Visual Basic]
[C#]
なお、このコードだけではユーザーがセル範囲を選択しているとき、選択範囲が解除されてしまいます。これを避けるには上記のコードの「クリックされたセルを取得する」の直前で次の処理を行います。
[Visual Basic]
[C#]
ここではセル範囲が選択されているときに右クリックメニューを表示する処理を行っていないため、セル範囲用の右クリックメニューを既定のメニューとして ContextMenu プロパティに設定しておく必要があります。
しかし、このプロパティはシートに対して割り当てられるもので、ユーザーが選択しているセルの内容に応じてメニューを変更したい場合には不十分です。また、El Tabelle の既定の動作では、右クリックでセルが選択されません。
右クリックでセルを選択し、さらにセルに応じたメニューを表示するには、Sheet の MouseDown イベントに次のようにコーディングします。
※ イベント ハンドラのコードは Visual Studio .NET で生成してください。
[Visual Basic]
Private Sub Sheet1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Sheet1.MouseDown
Dim objRange As New GrapeCity.Views.ElTabelle.Range()
'右クリックの場合
If e.Button = MouseButtons.Right Then
'クリックされたセルを取得する
If Sheet1.HitTest(New Point(e.X, e.Y), objRange) = GrapeCity.Views.ElTabelle.SheetArea.Cell Then
'クリックされたセルをアクティブにする
Sheet1.ActivePosition = New GrapeCity.Views.ElTabelle.Position(objRange.LeftColumn, objRange.TopRow)
'B1セルがクリックされたときのみ、右クリックメニュー(ContextMenu1)を表示する
If Sheet1.ActivePosition.Expression = "B1" Then
Sheet1.ContextMenu = ContextMenu1
Else
Sheet1.ContextMenu = Nothing
End If
End If
End If
End Sub
Dim objRange As New GrapeCity.Views.ElTabelle.Range()
'右クリックの場合
If e.Button = MouseButtons.Right Then
'クリックされたセルを取得する
If Sheet1.HitTest(New Point(e.X, e.Y), objRange) = GrapeCity.Views.ElTabelle.SheetArea.Cell Then
'クリックされたセルをアクティブにする
Sheet1.ActivePosition = New GrapeCity.Views.ElTabelle.Position(objRange.LeftColumn, objRange.TopRow)
'B1セルがクリックされたときのみ、右クリックメニュー(ContextMenu1)を表示する
If Sheet1.ActivePosition.Expression = "B1" Then
Sheet1.ContextMenu = ContextMenu1
Else
Sheet1.ContextMenu = Nothing
End If
End If
End If
End Sub
[C#]
private void sheet1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
GrapeCity.Views.ElTabelle.Range objRange = new GrapeCity.Views.ElTabelle.Range();
//右クリックの場合
if(e.Button == MouseButtons.Right)
{
//クリックされたセルを取得する
if(sheet1.HitTest(new System.Drawing.Point(e.X,e.Y), out objRange) == GrapeCity.Views.ElTabelle.SheetArea.Cell)
{
//クリックされたセルをアクティブにする
sheet1.ActivePosition = new GrapeCity.Views.ElTabelle.Position(objRange.LeftColumn,objRange.TopRow);
//B1セルがクリックされたときのみ、右クリックメニュー(ContextMenu1)を表示する
if(sheet1.ActivePosition.Expression == "B1")
{
sheet1.ContextMenu = contextMenu1;
}
else
{
sheet1.ContextMenu = null;
}
}
}
}
{
GrapeCity.Views.ElTabelle.Range objRange = new GrapeCity.Views.ElTabelle.Range();
//右クリックの場合
if(e.Button == MouseButtons.Right)
{
//クリックされたセルを取得する
if(sheet1.HitTest(new System.Drawing.Point(e.X,e.Y), out objRange) == GrapeCity.Views.ElTabelle.SheetArea.Cell)
{
//クリックされたセルをアクティブにする
sheet1.ActivePosition = new GrapeCity.Views.ElTabelle.Position(objRange.LeftColumn,objRange.TopRow);
//B1セルがクリックされたときのみ、右クリックメニュー(ContextMenu1)を表示する
if(sheet1.ActivePosition.Expression == "B1")
{
sheet1.ContextMenu = contextMenu1;
}
else
{
sheet1.ContextMenu = null;
}
}
}
}
なお、このコードだけではユーザーがセル範囲を選択しているとき、選択範囲が解除されてしまいます。これを避けるには上記のコードの「クリックされたセルを取得する」の直前で次の処理を行います。
[Visual Basic]
Dim objCurrent, objRanges() As GrapeCity.Views.ElTabelle.Range
'選択されているセル範囲をすべて取得する
objRanges = Sheet1.GetBlocks(GrapeCity.Views.ElTabelle.BlocksType.Selection)
'1つ以上のセルが選択されている場合
If objRanges.Length > 1 Then
Exit Sub
Else
'選択されているセル範囲のサイズをチェックする
For Each objCurrent In objRanges
If objCurrent.ColumnCount > 1 Then Exit Sub
If objCurrent.RowCount > 1 Then Exit Sub
Next
End If
'選択されているセル範囲をすべて取得する
objRanges = Sheet1.GetBlocks(GrapeCity.Views.ElTabelle.BlocksType.Selection)
'1つ以上のセルが選択されている場合
If objRanges.Length > 1 Then
Exit Sub
Else
'選択されているセル範囲のサイズをチェックする
For Each objCurrent In objRanges
If objCurrent.ColumnCount > 1 Then Exit Sub
If objCurrent.RowCount > 1 Then Exit Sub
Next
End If
[C#]
GrapeCity.Views.ElTabelle.Range[] objRanges;
//選択されているセル範囲をすべて取得する
objRanges = sheet1.GetBlocks(GrapeCity.Views.ElTabelle.BlocksType.Selection);
//1つ以上のセルが選択されている場合
if(objRanges.Length > 1)
{
return;
}
else
{
//選択されているセル範囲のサイズをチェックする
foreach(GrapeCity.Views.ElTabelle.Range objCurrent in objRanges)
{
if(objCurrent.ColumnCount > 1)
{
return;
}
if(objCurrent.RowCount > 1)
{
return;
}
}
}
//選択されているセル範囲をすべて取得する
objRanges = sheet1.GetBlocks(GrapeCity.Views.ElTabelle.BlocksType.Selection);
//1つ以上のセルが選択されている場合
if(objRanges.Length > 1)
{
return;
}
else
{
//選択されているセル範囲のサイズをチェックする
foreach(GrapeCity.Views.ElTabelle.Range objCurrent in objRanges)
{
if(objCurrent.ColumnCount > 1)
{
return;
}
if(objCurrent.RowCount > 1)
{
return;
}
}
}
ここではセル範囲が選択されているときに右クリックメニューを表示する処理を行っていないため、セル範囲用の右クリックメニューを既定のメニューとして ContextMenu プロパティに設定しておく必要があります。
キーワード
HowTo
この文書は、以前は次のFAQ IDで公開されていました : 3344