Tabキーの動作について

文書番号 : 38980     文書種別 : 使用方法     登録日 : 2015/07/03     最終更新日 : 2015/07/03
文書を印刷する
対象製品
SPREAD for Windows Forms 8.0J
詳細
下記にTabキーのデフォルトの動作およびカスタマイズ方法について記載します。

1.[Tab]キーのデフォルトの動作
2.[Tab]キー押下によって次のコントロールへフォーカスを遷移させる
3.最終セル(シート右下)の[Tab]キー押下時に次のコントロールへフォーカスを遷移させる


1.[Tab]キーのデフォルトの動作

SPREADには、キーボードからの入力(ユーザーがキーボードからキーを押下)を特定のアクションを識別するオブジェクトに変換する入力マップと、特定のアクションを識別するオブジェクトを、そのアクションに変換するためのアクションマップが存在します。この、入力マップとアクションマップを使用してユーザーからのキーボード入力を、SPREADコンポーネントの特定アクションに対応付けることが出来ます。

例えば、[Tab]キーの押下によって実行されるアクションは、アクティブセルを次の列に移動し、行の終わりに達したら折り返して次の行の先頭のセルに移動します。

キーコード   :Tab
アクション  :アクティブセルを次の列に移動。行の最後に達した場合は先頭に戻ります。
アクション名:MoveToNextColumnWrap

新規フォーム上にSPREADと標準のテキストボックスを下記の図のように配置し、上部に配置したコントロールから順にTabIndexを割り当てた場合、[Tab]キーの押下によってフォーカスおよびアクティブセルは次のように動作します。



フォーカスがTextBox1に存在している状態で[Tab]キー押下するとSPREADにフォーカスが移動します。その後の[Tab]キー押下によってSPREADのシート上をアクティブセルが移動し、最終セル(シート右下)に達したところでアクティブセルが止まります。この状態で[Tab]キーを押下した場合でもTextBox2へフォーカスは移動しません。

2.[Tab]キー押下によって次のコントロールへフォーカスを遷移させる

フォーカスがTextBox1に存在している状態で[Tab]キー押下するとSPREADにフォーカスが移動します。この状態での[Tab]キー押下によって、アクティブセルの移動ではなく次のコントロールへのフォーカス遷移を行う場合には、デフォルト定義されている[Tab]キーのアクションを無効とすることで実現できます。



下記のように[Tab]キーにデフォルトで割り当てられている「MoveToNextColumnWrap」アクションを、「None」アクションに変更しデフォルト定義されている動作を無効とします。「None」アクションは、キーボード操作が入力マップによって処理されていないことを示す特殊なアクションです。

【デフォルトのアクション】
キーコード   :Tab
アクション  :アクティブセルを次の列に移動。行の最後に達した場合は先頭に戻ります。
アクション名:MoveToNextColumnWrap

【変更後のアクション】
キーコード   :Tab
アクション  :アクションを実行しません。
アクション名:None

◎サンプルコード(VB)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  FpSpread1.ActiveSheet.RowCount = 3
  FpSpread1.ActiveSheet.ColumnCount = 4

  Dim im As New FarPoint.Win.Spread.InputMap
  ' 非編集セルでの[Tab]キーを「無効」とします
  im = FpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenFocused)
  im.Put(New FarPoint.Win.Spread.Keystroke(Keys.Tab, Keys.None), FarPoint.Win.Spread.SpreadActions.None)
  ' 編集中セルでの[Tab]キーを「無効」とします
  im = FpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenAncestorOfFocused)
  im.Put(New FarPoint.Win.Spread.Keystroke(Keys.Tab, Keys.None), FarPoint.Win.Spread.SpreadActions.None)
End Sub


◎サンプルコード(C#)
private void Form1_Load(object sender, EventArgs e)
{
  fpSpread1.ActiveSheet.RowCount = 3;
  fpSpread1.ActiveSheet.ColumnCount = 4;

  FarPoint.Win.Spread.InputMap im = new FarPoint.Win.Spread.InputMap();
  // 非編集セルでの[Tab]キーを無効とします
  im = fpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenFocused);
  im.Put(new FarPoint.Win.Spread.Keystroke(Keys.Tab, Keys.None), FarPoint.Win.Spread.SpreadActions.None);
  // 編集中セルでの[Tab]キーを無効とします
  im = fpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenAncestorOfFocused);
  im.Put(new FarPoint.Win.Spread.Keystroke(Keys.Tab, Keys.None), FarPoint.Win.Spread.SpreadActions.None);
}


3.最終セル(シート右下)の[Tab]キー押下時に次のコントロールへフォーカスを遷移させる

フォーカスがTextBox1に存在している状態で[Tab]キー押下するとSPREADにフォーカスが移動します。その後の[Tab]キー押下にてSPREADのシート内の移動を行い、アクティブセルが最終セルに到達した時点でTextBox2へフォーカスを遷移させる場合は、Advanceイベントを使用することで対応可能となります。



アクティブセルがSPREADの最終セル(シート右下)にある場合には[Tab]キー押下によって、また先頭セル(シート左上)にある場合は[Shift]+[Tab]キー押下によってAdvanceイベントが発生します。イベント内でSelectNextControlメソッドを呼び出しフォーカスを遷移させることが可能です。Advanceイベントでは、AdvanceEventArgsクラスである引数eより以下の情報を参照できます。

e.AdvanceNext:前のコントロールに戻るか次のコントロールに進むかを決定する値を取得します
e.Cancel      :デフォルトの処理をキャンセルするかどうかを指定する値を取得または設定します

なお、[Tab]キー押下以外にも[カーソル]キーや、例えば入力マップによりセル移動を定義した[Enter]キー押下などによっても上記イベントを利用することが出来ますので、用途によって使い分けてください。(サンプルコード中のSelectNextControlメソッドについてはMSDNライブラリをご参照ください。)

◎サンプルコード(VB)
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
  FpSpread1.ActiveSheet.RowCount = 3
  FpSpread1.ActiveSheet.ColumnCount = 4
End Sub

Private Sub FpSpread1_Advance(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.AdvanceEventArgs) Handles FpSpread1.Advance
  Dim iRow As Integer = FpSpread1.ActiveSheet.ActiveRowIndex
  Dim iCol As Integer = FpSpread1.ActiveSheet.ActiveColumnIndex
  If (iRow = 0 And iCol = 0) Or _
    (iRow = FpSpread1.ActiveSheet.RowCount - 1 And iCol = FpSpread1.ActiveSheet.ColumnCount - 1) Then
    ' 先頭セルまたは最終セルがアクティブの場合のみ
    e.Cancel = true
    Me.SelectNextControl(FpSpread1, e.AdvanceNext, True, True, True)
  End If
End Sub


◎サンプルコード(C#)
private void Form1_Load(object sender, System.EventArgs e)
{
  fpSpread1.ActiveSheet.RowCount = 3;
  fpSpread1.ActiveSheet.ColumnCount = 4;
}

private void fpSpread1_Advance(object sender, FarPoint.Win.Spread.AdvanceEventArgs e)
{
  int iRow = fpSpread1.ActiveSheet.ActiveRowIndex;
  int iCol = fpSpread1.ActiveSheet.ActiveColumnIndex;
  if (iRow == 0 && iCol == 0 || iRow == fpSpread1.ActiveSheet.RowCount - 1 && iCol == fpSpread1.ActiveSheet.ColumnCount - 1);
  {
    // 先頭セルまたは最終セルがアクティブの場合のみ
    e.Cancel = true;
    this.SelectNextControl(fpSpread1, e.AdvanceNext, true, true, true);
  }
}