右クリックメニューをセル毎に割り当てるには?

文書番号 : 11445     文書種別 : 使用方法     最終更新日 : 2003/04/01
文書を印刷する
対象製品
El Tabelle for .NET
詳細
El Tabelle の Sheet には、右クリックメニューを割り当てるための ContextMenu プロパティが備えられています。ContextMenu プロパティに .NET Framework の 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


[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;
      }
    }
  }
}


なお、このコードだけではユーザーがセル範囲を選択しているとき、選択範囲が解除されてしまいます。これを避けるには上記のコードの「クリックされたセルを取得する」の直前で次の処理を行います。

[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


[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;
    }
  }
}


ここではセル範囲が選択されているときに右クリックメニューを表示する処理を行っていないため、セル範囲用の右クリックメニューを既定のメニューとして ContextMenu プロパティに設定しておく必要があります。
キーワード
HowTo

この文書は、以前は次のFAQ IDで公開されていました : 3344