【数値型セル】 スピンボタンによる値の増減をキーボード入力(上下カーソルキー)で行うことは出来ますか?

文書番号 : 33620     文書種別 : 使用方法     登録日 : 2012/11/14     最終更新日 : 2012/11/14
文書を印刷する
対象製品
SPREAD for Windows Forms 7.0J
詳細
上下カーソルキーに定義されているデフォルトの入力マップを制御し、Keyイベントにて値の増減を行う各メソッド呼び出しを行うことで可能となります。具体的な実装方法については以下をご参照ください。

※サンプルコード内の『SpinUpNotifyメソッド』および『SpinDownNotifyメソッド』については、SPREAD内部にて使用されているもので一般的な機能としては提供されていません。また、製品ヘルプにも記載がないことを予めご了承ください。

※サンプルコードでは入力マップの定義を編集開始/終了のタイミングによって適宜切り替えていますが、上下キーによるセル移動を行わない場合には必要ありません( [Ctrl]+[上下キー] によってセル移動が可能です)。 なお、このような入力マップの制御を行う場合は予め十分な動作検証を行ってください。

◎サンプルコード(VB)
Imports FarPoint.Win.Spread
Imports FarPoint.Win.Spread.CellType


  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    '数値型セル定義
    Dim numCell As New NumberCellType
    numCell.SpinButton = True
    numCell.SpinWrap = True
    FpSpread1.ActiveSheet.Columns(0).CellType = numCell
  End Sub

  Private Sub FpSpread1_EditModeOn(ByVal sender As Object, ByVal e As System.EventArgs) Handles FpSpread1.EditModeOn
    'KeyUpイベントをハンドル
    AddHandler FpSpread1.EditingControl.KeyUp, AddressOf FpSpread1_KeyUp

    Dim iRow As Integer = FpSpread1.ActiveSheet.ActiveRowIndex
    Dim iCol As Integer = FpSpread1.ActiveSheet.ActiveColumnIndex

    '数値型セルが編集モードになった場合、デフォルトの上下キー動作を無効とする
    If TypeOf (FpSpread1.ActiveSheet.GetCellType(iRow, iCol)) Is NumberCellType Then
      Dim im As InputMap = FpSpread1.GetInputMap(InputMapMode.WhenAncestorOfFocused)
      im.Put(New Keystroke(Keys.Up, Keys.None), SpreadActions.None)
      im.Put(New Keystroke(Keys.Down, Keys.None), SpreadActions.None)
    End If

  End Sub

  Private Sub FpSpread1_EditModeOff(ByVal sender As Object, ByVal e As System.EventArgs) Handles FpSpread1.EditModeOff
    'KeyUpイベントをハンドル解除
    RemoveHandler FpSpread1.EditingControl.KeyUp, AddressOf FpSpread1_KeyUp

    Dim iRow As Integer = FpSpread1.ActiveSheet.ActiveRowIndex
    Dim iCol As Integer = FpSpread1.ActiveSheet.ActiveColumnIndex

    '数値型セルが非編集モードになった場合、デフォルトの上下キー動作をデフォルトに戻す
    If TypeOf (FpSpread1.ActiveSheet.GetCellType(iRow, iCol)) Is NumberCellType Then
      Dim im As InputMap = FpSpread1.GetInputMap(InputMapMode.WhenAncestorOfFocused)
      im.Put(New Keystroke(Keys.Up, Keys.None), SpreadActions.MoveToPreviousRow)
      im.Put(New Keystroke(Keys.Down, Keys.None), SpreadActions.MoveToNextRow)
    End If

  End Sub

  Private Sub FpSpread1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles FpSpread1.KeyUp

    Dim iRow As Integer = FpSpread1.ActiveSheet.ActiveRowIndex
    Dim iCol As Integer = FpSpread1.ActiveSheet.ActiveColumnIndex

    '数値型セルが編集モードの場合、上下キー押下によってをスピンボタンを動作させる
    If TypeOf (FpSpread1.ActiveSheet.GetCellType(iRow, iCol)) Is NumberCellType And FpSpread1.EditMode Then
      If e.KeyCode = Keys.Up Then
        CType(FpSpread1.EditingControl, GeneralEditor).SpinUpNotify(FpSpread1)
      ElseIf e.KeyCode = Keys.Down Then
        CType(FpSpread1.EditingControl, GeneralEditor).SpinDownNotify(FpSpread1)
      End If
    End If

  End Sub


◎サンプルコード(C#)
using FarPoint.Win.Spread;
using FarPoint.Win.Spread.CellType;


  private void Form1_Load(object sender, System.EventArgs e)
  {
    //数値型セル定義
    NumberCellType numCell = new NumberCellType();
    numCell.SpinButton = true;
    numCell.SpinWrap = true;
    fpSpread1.ActiveSheet.Columns[0].CellType = numCell;
  }

  private void fpSpread1_EditModeOn(object sender, System.EventArgs e)
  {
    //KeyUpイベントをハンドル
    fpSpread1.EditingControl.KeyUp += new KeyEventHandler(this.fpSpread1_KeyUp);

    int iRow = fpSpread1.ActiveSheet.ActiveRowIndex;
    int iCol = fpSpread1.ActiveSheet.ActiveColumnIndex;

    //数値型セルが編集モードになった場合、デフォルトの上下キー動作を無効とする
    if (fpSpread1.ActiveSheet.GetCellType(iRow, iCol) is NumberCellType)
    {
      InputMap im = fpSpread1.GetInputMap(InputMapMode.WhenAncestorOfFocused);
      im.Put(new Keystroke(Keys.Up , Keys.None), SpreadActions.None);
      im.Put(new Keystroke(Keys.Down, Keys.None), SpreadActions.None);
    }

  }

  private void fpSpread1_EditModeOff(object sender, System.EventArgs e)
  {
    //KeyUpイベントをハンドル解除
    fpSpread1.EditingControl.KeyUp -= new KeyEventHandler(this.fpSpread1_KeyUp);

    int iRow = fpSpread1.ActiveSheet.ActiveRowIndex;
    int iCol = fpSpread1.ActiveSheet.ActiveColumnIndex;

    //数値型セルが非編集モードになった場合、デフォルトの上下キー動作をデフォルトに戻す
    if (fpSpread1.ActiveSheet.GetCellType(iRow, iCol) is NumberCellType)
    {
      InputMap im = fpSpread1.GetInputMap(InputMapMode.WhenAncestorOfFocused);
      im.Put(new Keystroke(Keys.Up , Keys.None), SpreadActions.MoveToPreviousRow);
      im.Put(new Keystroke(Keys.Down, Keys.None), SpreadActions.MoveToNextRow);
    }
  }

  private void fpSpread1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
  {
    int iRow = fpSpread1.ActiveSheet.ActiveRowIndex;
    int iCol = fpSpread1.ActiveSheet.ActiveColumnIndex;

    //数値型セルが編集モードの場合、上下キー押下によってをスピンボタンを動作させる
    if (fpSpread1.ActiveSheet.GetCellType(iRow, iCol) is NumberCellType && fpSpread1.EditMode)
    {
      if (e.KeyCode == Keys.Up)
        ((GeneralEditor)fpSpread1.EditingControl).SpinUpNotify(fpSpread1);
      else if (e.KeyCode == Keys.Down)
        ((GeneralEditor)fpSpread1.EditingControl).SpinDownNotify(fpSpread1);
    }
  }
関連情報
キーワード
「キー操作」