セル/列ヘッダ/行ヘッダで異なるコンテキストメニューを表示したい

文書番号 : 38958     文書種別 : 使用方法     登録日 : 2015/07/02     最終更新日 : 2015/07/02
文書を印刷する
対象製品
SPREAD for Windows Forms 8.0J
詳細
シート上でコンテキストメニューを表示する場合には、標準のContextMenuStripクラスを使用します。セル/列ヘッダ/行ヘッダで異なるメニューを表示するには、セルがクリックされたときに発生するCellClickイベント内でメニューに表示する項目を切り替えることで実現できます。

◎サンプルコード(VB)
Private cMenu As ContextMenuStrip
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  ' コンテキストメニューの作成
  cMenu = New ContextMenuStrip()
  cMenu.Items.Add("行の削除", Nothing, New System.EventHandler(AddressOf DeleteRow))
  cMenu.Items.Add("列の削除", Nothing, New System.EventHandler(AddressOf DeleteColumn))
  cMenu.Items.Add("値の削除", Nothing, New System.EventHandler(AddressOf DeleteValue))
  For i As Integer = 0 To cMenu.Items.Count - 1
    cMenu.Items(i).Name = cMenu.Items(i).Text
  Next

  ' テストデータの設定
  For i As Integer = 0 To 10 - 1
    For j As Integer = 0 To 10 - 1
      FpSpread1.ActiveSheet.SetValue(i, j, String.Format("R{0}C{1}", i, j))
    Next
  Next
End Sub

Private Sub FpSpread1_CellClick(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.CellClickEventArgs) Handles FpSpread1.CellClick
  ' マウスの右ボタンでクリックされた場合
  If e.Button = Windows.Forms.MouseButtons.Right Then
    ' アクティブセルの設定
    FpSpread1.ActiveSheet.SetActiveCell(e.Row, e.Column)
    ' コンテキストメニューの項目を設定
    If e.RowHeader = True And e.ColumnHeader = True Then
      ' シートコーナーの場合
      cMenu.Items("行の削除").Visible = False
      cMenu.Items("列の削除").Visible = False
      cMenu.Items("値の削除").Visible = False
    ElseIf e.RowHeader Then
      ' 行ヘッダの場合
      cMenu.Items("行の削除").Visible = True
      cMenu.Items("列の削除").Visible = False
      cMenu.Items("値の削除").Visible = False
    ElseIf e.ColumnHeader Then
      ' 列ヘッダの場合
      cMenu.Items("行の削除").Visible = False
      cMenu.Items("列の削除").Visible = True
      cMenu.Items("値の削除").Visible = False
    ElseIf Not e.ColumnFooter Then
      ' 通常セルの場合
      cMenu.Items("行の削除").Visible = False
      cMenu.Items("列の削除").Visible = False
      cMenu.Items("値の削除").Visible = True
    End If
    ' コンテキストメニューの表示
    cMenu.Show(FpSpread1, e.X, e.Y)
  End If
End Sub

Private Sub DeleteRow(ByVal sender As Object, ByVal e As System.EventArgs)
  ' RemoveRowsメソッドの呼び出し
  FpSpread1.ActiveSheet.RemoveRows(FpSpread1.ActiveSheet.ActiveRowIndex, 1)
End Sub

Private Sub DeleteColumn(ByVal sender As Object, ByVal e As System.EventArgs)
  ' RemoveColumnsメソッドの呼び出し   FpSpread1.ActiveSheet.RemoveColumns(FpSpread1.ActiveSheet.ActiveColumnIndex, 1)
End Sub

Private Sub DeleteValue(ByVal sender As Object, ByVal e As System.EventArgs)
  ' ClearRangeメソッドの呼び出し
  FpSpread1.ActiveSheet.ClearRange(FpSpread1.ActiveSheet.ActiveRowIndex, FpSpread1.ActiveSheet.ActiveColumnIndex, 1, 1, True)
End Sub


◎サンプルコード(C#)
private ContextMenuStrip cMenu;
private void Form1_Load(object sender, EventArgs e)
{
  // コンテキストメニューの作成
  cMenu = new ContextMenuStrip();
  cMenu.Items.Add("行の削除", null, new System.EventHandler(DeleteRow));
  cMenu.Items.Add("列の削除", null, new System.EventHandler(DeleteColumn));
  cMenu.Items.Add("値の削除", null, new System.EventHandler(DeleteValue));
  for (int i = 0; i < cMenu.Items.Count; i++)
  {
    cMenu.Items[i].Name = cMenu.Items[i].Text;
  }

  // テストデータの設定
  for (int i = 0; i < 10; i++)
  {
    for (int j = 0; j < 10; j++)
    {
      fpSpread1.ActiveSheet.SetValue(i, j, String.Format("R{0}C{1}", i, j));
    }
  }
}

private void fpSpread1_CellClick(object sender, FarPoint.Win.Spread.CellClickEventArgs e)
{
  // マウスの右ボタンでクリックされた場合
  if (e.Button == MouseButtons.Right)
  {
    // アクティブセルの設定
    fpSpread1.ActiveSheet.SetActiveCell(e.Row, e.Column);
    // コンテキストメニューの項目を設定
    if( e.RowHeader && e.ColumnHeader)
    {
      // シートコーナーの場合
      cMenu.Items["行の削除"].Visible = false;
      cMenu.Items["列の削除"].Visible = false;
      cMenu.Items["値の削除"].Visible = false;
    } else if (e.RowHeader)
    {
      // 行ヘッダの場合
      cMenu.Items["行の削除"].Visible = true;
      cMenu.Items["列の削除"].Visible = false;
      cMenu.Items["値の削除"].Visible = false;
    } else if (e.ColumnHeader)
    {
      // 列ヘッダの場合
      cMenu.Items["行の削除"].Visible = false;
      cMenu.Items["列の削除"].Visible = true;
      cMenu.Items["値の削除"].Visible = false;
    } else if (!e.ColumnFooter)
    {
      // 通常セルの場合
      cMenu.Items["行の削除"].Visible = false;
      cMenu.Items["列の削除"].Visible = false;
      cMenu.Items["値の削除"].Visible = true;
    }
    // コンテキストメニューの表示
    cMenu.Show(fpSpread1, e.X, e.Y);
  }
}

private void DeleteRow(object sender, System.EventArgs e)
{
  // RemoveRowsメソッドの呼び出し
  fpSpread1.ActiveSheet.RemoveRows(fpSpread1.ActiveSheet.ActiveRowIndex, 1);
}

private void DeleteColumn(object sender, System.EventArgs e)
{
  // RemoveColumnsメソッドの呼び出し   fpSpread1.ActiveSheet.RemoveColumns(fpSpread1.ActiveSheet.ActiveColumnIndex, 1);
}

private void DeleteValue(object sender, System.EventArgs e)
{
  // ClearRangeメソッドの呼び出し
  fpSpread1.ActiveSheet.ClearRange(fpSpread1.ActiveSheet.ActiveRowIndex, fpSpread1.ActiveSheet.ActiveColumnIndex, 1, 1, true);
}
関連情報