【コンボボックス型セル】【マルチカラムコンボボックス型セル】 Enterキーによりドロップダウンリストが表示されるのを抑止する方法はありますか?

文書番号 : 29975     文書種別 : 技術情報     最終更新日 : 2010/10/09
文書を印刷する
対象製品
SPREAD for Windows Forms 5.0J
詳細
コンボボックス型セルでは、編集中のエディタとしてFpComboクラスが使用されます。FpComboクラスのKeyDownイベントとDropDownイベントを使用して、Enterキーによるドロップダウンリストの表示をキャンセルすることができます。

なお、[Enter]キーによりアクティブセルを右隣に移動させるには、Combo_DropDownイベント内でSendKeys.Send("{Tab}")メソッドを呼び出します。

◎サンプルコード(VB)
Dim bEnterKey As Boolean
Dim WithEvents Combo As New FarPoint.Win.FpCombo()

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  ' 常時入力モードを有効にする
  FpSpread1.EditModePermanent = True
    
  ' コンボボックス型セルを第2列に設定する
  Dim cbCell As New FarPoint.Win.Spread.CellType.ComboBoxCellType()
  cbCell.Items = New String() {"123", "456", "789", "abc", "def"}
  FpSpread1.ActiveSheet.Columns(1).CellType = cbCell
End Sub

Private Sub FpSpread1_EditModeOn(ByVal sender As Object, ByVal e As System.EventArgs) Handles FpSpread1.EditModeOn
  ' セル型がコンボボックス型の場合は、EditingControlをComboにマッピングする   Dim iRow As Integer = FpSpread1.ActiveSheet.ActiveRowIndex
  Dim iCol As Integer = FpSpread1.ActiveSheet.ActiveColumnIndex

  If TypeOf (FpSpread1.ActiveSheet.GetCellType(iRow, iCol)) Is FarPoint.Win.Spread.CellType.ComboBoxCellType Then
    Combo = CType(FpSpread1.EditingControl, FarPoint.Win.FpCombo)
  End If
End Sub

Private Sub Combo_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Combo.KeyDown
  ' Enterキーが押された場合にフラグを立てる
  bEnterKey = (e.KeyCode = Keys.Enter)
End Sub

Private Sub Combo_DropDown(ByVal sender As Object, ByVal e As FarPoint.Win.DropDownEventArgs) Handles Combo.DropDown
  ' フラグが立っている場合は、DropDown処理をキャンセルする
  e.Cancel = bEnterKey
  bEnterKey = False

  ' アクティブセルを右隣に移動させる場合は次のコードを有効にする
  'SendKeys.Send("{Tab}")
End Sub

◎サンプルコード(C#)
private FarPoint.Win.FpCombo Combo;
private bool bEnterKey;

private void Form1_Load(object sender, EventArgs e)
{
  // 常時入力モードを有効にする
  fpSpread1.EditModePermanent = true;

  //コンボボックス型セルを第2列に設定する
  FarPoint.Win.Spread.CellType.ComboBoxCellType cbCell = new FarPoint.Win.Spread.CellType.ComboBoxCellType();
  cbCell.Items = new string[] { "123", "456", "789", "abc", "def" };
  fpSpread1.ActiveSheet.Columns[1].CellType = cbCell;
}

private void fpSpread1_EditModeOn(object sender, EventArgs e)
{
  //セル型がコンボボックス型の場合は、EditingControlをComboにマッピングする   int irow = fpSpread1.ActiveSheet.ActiveRowIndex;
  int icol = fpSpread1.ActiveSheet.ActiveColumnIndex;
  if (fpSpread1.ActiveSheet.GetCellType(irow, icol) is FarPoint.Win.Spread.CellType.ComboBoxCellType)
  {
    Combo = (FarPoint.Win.FpCombo)fpSpread1.EditingControl;

    //Comboのイベントをマッピングする
    Combo.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Combo_KeyDown);
    Combo.DropDown += new FarPoint.Win.DropDownEventHandler(this.Combo_DropDown);
  }
}

private void fpSpread1_EditModeOff(object sender, EventArgs e)
{
  int irow = fpSpread1.ActiveSheet.ActiveRowIndex;
  int icol = fpSpread1.ActiveSheet.ActiveColumnIndex;
  if (fpSpread1.ActiveSheet.GetCellType(irow, icol) is FarPoint.Win.Spread.CellType.ComboBoxCellType)
  {
    Combo.KeyDown -= new System.Windows.Forms.KeyEventHandler(this.Combo_KeyDown);
    Combo.DropDown -= new FarPoint.Win.DropDownEventHandler(this.Combo_DropDown);
  }
}

private void Combo_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
  //Enterキーが押された場合にフラグを立てる
  bEnterKey = (e.KeyCode == Keys.Enter);
}

private void Combo_DropDown(object sender, FarPoint.Win.DropDownEventArgs e)
{
  //フラグが立っている場合は、DropDown処理をキャンセルする
  e.Cancel = bEnterKey;
  bEnterKey = false;

  // アクティブセルを右隣に移動させる場合は次のコードを有効にする
  //SendKeys.Send("{Tab}");
}

一方で、マルチカラムコンボボックス型セルではSubEditorOpeningイベントを使用してドロップダウンリストの表示を抑止します。なお、マウス操作を除く[Alt]+[下矢印]キーや[F4]キーによるドロップダウンリストも表示されなくなりますので注意が必要です。

コンボボックス型セルと同様に、[Enter]キーによりアクティブセルを右隣に移動させるには、SubEditorOpeningイベント内でSendKeys.Send("{Tab}")メソッドを呼び出します。

◎サンプルコード(VB)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  ' データの作成
  Dim dt As New DataTable("TEST")
  dt.Columns.Add("Code", GetType(Int32))
  dt.Columns.Add("Name", GetType(String))
  dt.Rows.Add(100, "AAA")
  dt.Rows.Add(200, "BBB")
  dt.AcceptChanges()

  ' マルチカラムコンボボックス型セルの作成
  Dim comboCell As New FarPoint.Win.Spread.CellType.MultiColumnComboBoxCellType()
  comboCell.DataSourceList = dt

  ' SPREADの設定
  FpSpread1.EditModePermanent = True
  FpSpread1.ActiveSheet.Columns(1).CellType = comboCell
  FpSpread1.ActiveSheet.SetColumnWidth(1, 120)
End Sub

Private Sub FpSpread1_SubEditorOpening(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.SubEditorOpeningEventArgs) Handles FpSpread1.SubEditorOpening
  ' マルチカラムコンボボックス型セルの場合
  If TypeOf FpSpread1.ActiveSheet.GetCellType(e.Row, e.Column) Is FarPoint.Win.Spread.CellType.MultiColumnComboBoxCellType Then
    ' キー操作によってドロップダウンリストが表示される場合
    If FarPoint.Win.Spread.FpSpread.MouseButtons = Windows.Forms.MouseButtons.None Then
      ' ドロップダウンリストの表示をキャンセル
      e.Cancel = True

      ' アクティブセルを右隣に移動させる場合は次のコードを有効にする
      'SendKeys.Send("{Tab}")
    End If
  End If
End Sub

◎サンプルコード(C#)
private void Form1_Load(object sender, EventArgs e)
{
  // データの作成
  DataTable dt = new DataTable("TEST");
  dt.Columns.Add("Code", Type.GetType("System.Int32"));
  dt.Columns.Add("Name", Type.GetType("System.String"));
  dt.Rows.Add(100, "AAA");
  dt.Rows.Add(200, "BBB");
  dt.AcceptChanges();

  // マルチカラムコンボボックス型セルの作成
  FarPoint.Win.Spread.CellType.MultiColumnComboBoxCellType comboCell = new FarPoint.Win.Spread.CellType.MultiColumnComboBoxCellType();
  comboCell.DataSourceList = dt;

  // SPREADの設定
  fpSpread1.EditModePermanent = true;
  fpSpread1.ActiveSheet.Columns[1].CellType = comboCell;
  fpSpread1.ActiveSheet.SetColumnWidth(1, 120);
}

private void fpSpread1_SubEditorOpening(object sender, FarPoint.Win.Spread.SubEditorOpeningEventArgs e)
{
  // マルチカラムコンボボックス型セルの場合
  if (fpSpread1.ActiveSheet.GetCellType(e.Row, e.Column) is FarPoint.Win.Spread.CellType.MultiColumnComboBoxCellType)
  {
    // キー操作によってドロップダウンリストが表示される場合
    if (FarPoint.Win.Spread.FpSpread.MouseButtons == System.Windows.Forms.MouseButtons.None)
    {
      // ドロップダウンリストの表示をキャンセル
      e.Cancel = true;

      // アクティブセルを右隣に移動させる場合は次のコードを有効にする
      //SendKeys.Send("{Tab}");
    }
  }
}
関連情報
キーワード
「コンボボックス型セル/マルチカラムコンボボックス型セル」