最終セルで[Tab]キーを押下された際に次のコントロールに移動したい

文書番号 : 37561     文書種別 : 使用方法     登録日 : 2014/09/03     最終更新日 : 2014/09/03
文書を印刷する
対象製品
SPREAD for WPF 1.0J
詳細
InputBindingsを使用してキーボードの入力マップ(ショートカットキー)でMoveNextThenControlを設定することで、最終セルで[Tab]キーを押下された際に次のコントロールに移動することができます。

◎サンプルコード(VB)
Public Sub New()
  InitializeComponent()

  GcSpreadGrid1.RowCount = 3
  GcSpreadGrid1.ColumnCount = 3

  ' [Tab]キーのデフォルトのキー設定を変更
  GcSpreadGrid1.InputBindings.Add(New InputBinding(GcSpreadGrid1.NavigationCommands.MoveNextThenControl, New KeyGesture(Key.Tab)))
End Sub


◎サンプルコード(C#)
public MainWindow()
{
  InitializeComponent();

  gcSpreadGrid1.RowCount = 3;
  gcSpreadGrid1.ColumnCount = 3;

  // [Tab]キーのデフォルトのキー設定を変更
  gcSpreadGrid1.InputBindings.Add(new InputBinding(gcSpreadGrid1.NavigationCommands.MoveNextThenControl, new KeyGesture(Key.Tab)));
}



なお、SPREADではSelectionUnitをRowやColumnに設定した場合、アクティブセルの移動は、次の行/列やコントロールではなく、現在選択されている行や列内の移動となります。この場合は、以下に示されているようなカスタムコマンドを実装する必要があります。

◎サンプルコード(VB)
Public Sub New()
  InitializeComponent()

  GcSpreadGrid1.RowCount = 3
  GcSpreadGrid1.ColumnCount = 3

  GcSpreadGrid1.SelectionUnit = GrapeCity.Windows.SpreadGrid.SelectionUnit.Row

  ' [Tab]キーのデフォルトのキー設定を変更
  GcSpreadGrid1.InputBindings.Add(New InputBinding(New MyCommand(Me.GcSpreadGrid1), New KeyGesture(Key.Tab)))
  KeyboardNavigation.SetTabNavigation(Me.GcSpreadGrid1, KeyboardNavigationMode.None)
End Sub

Public Class MyCommand
  Implements ICommand

  Private _gcSpreadGrid As GrapeCity.Windows.SpreadGrid.GcSpreadGrid

  Public Sub New(gcSpraedGrid As GrapeCity.Windows.SpreadGrid.GcSpreadGrid)
    _gcSpreadGrid = gcSpraedGrid
  End Sub

  Public Function CanExecute(parameter As Object) As Boolean Implements ICommand.CanExecute
    Return True
  End Function

  Public Event CanExecuteChanged As EventHandler Implements ICommand.CanExecuteChanged

  Public Sub Execute(parameter As Object) Implements ICommand.Execute
    ' 最後のセルの場合、次のコントロールに移動
    If Me._gcSpreadGrid.ActiveRowIndex = Me._gcSpreadGrid.RowCount - 1 AndAlso Me._gcSpreadGrid.ActiveColumnIndex = Me._gcSpreadGrid.ColumnCount - 1 Then
      Dim tRequest As New TraversalRequest(FocusNavigationDirection.[Next])
      Dim keyboardFocus As UIElement = TryCast(Keyboard.FocusedElement, UIElement)
      If keyboardFocus IsNot Nothing Then
        keyboardFocus.MoveFocus(tRequest)
      End If
      Return
    End If
    ' RowやCellモードの場合
    If Me._gcSpreadGrid.SelectionUnit = GrapeCity.Windows.SpreadGrid.SelectionUnit.Row OrElse Me._gcSpreadGrid.SelectionUnit = GrapeCity.Windows.SpreadGrid.SelectionUnit.Cell Then
      ' 行の最後のセルの場合は、アクティブセルを次の行の最初のセルに移動
      If Me._gcSpreadGrid.ActiveColumnIndex = Me._gcSpreadGrid.ColumnCount - 1 Then
        Me._gcSpreadGrid.ActiveCellPosition = New GrapeCity.Windows.SpreadGrid.CellPosition(Me._gcSpreadGrid.ActiveRowIndex + 1, 0)
        Return
      Else
        '現在の行内の次のセルへ移動
        Me._gcSpreadGrid.ActiveCellPosition = New GrapeCity.Windows.SpreadGrid.CellPosition(Me._gcSpreadGrid.ActiveRowIndex, Me._gcSpreadGrid.ActiveColumnIndex + 1)
      End If
    End If
    'Columnモードの場合
    If Me._gcSpreadGrid.SelectionUnit = GrapeCity.Windows.SpreadGrid.SelectionUnit.Column Then
      '列の最後のセルの場合は、アクティブセルを次の列の最初のセルに移動
      If Me._gcSpreadGrid.ActiveRowIndex = Me._gcSpreadGrid.RowCount - 1 Then
        Me._gcSpreadGrid.ActiveCellPosition = New GrapeCity.Windows.SpreadGrid.CellPosition(0, Me._gcSpreadGrid.ActiveColumnIndex + 1)
        Return
      Else
        '現在の列内の次のセルへ移動
        Me._gcSpreadGrid.ActiveCellPosition = New GrapeCity.Windows.SpreadGrid.CellPosition(Me._gcSpreadGrid.ActiveRowIndex + 1, Me._gcSpreadGrid.ActiveColumnIndex)
      End If
    End If
  End Sub
End Class


◎サンプルコード(C#)
public MainWindow()
{
  InitializeComponent();

  gcSpreadGrid1.RowCount = 3;
  gcSpreadGrid1.ColumnCount = 3;

  gcSpreadGrid1.SelectionUnit = GrapeCity.Windows.SpreadGrid.SelectionUnit.Row;

  // [Tab]キーのデフォルトのキー設定を変更
  gcSpreadGrid1.InputBindings.Add(new InputBinding(new MyCommand(this.gcSpreadGrid1), new KeyGesture(Key.Tab)));
  KeyboardNavigation.SetTabNavigation(this.gcSpreadGrid1, KeyboardNavigationMode.None);
}

public class MyCommand : ICommand
{
  private GrapeCity.Windows.SpreadGrid.GcSpreadGrid _gcSpreadGrid;
  public MyCommand(GrapeCity.Windows.SpreadGrid.GcSpreadGrid gcSpraedGrid)
  {
    _gcSpreadGrid = gcSpraedGrid;
  }
  public bool CanExecute(object parameter)
  {
    return true;
  }

  public event EventHandler CanExecuteChanged;

  public void Execute(object parameter)
  {
    //最後のセルの場合、次のコントロールに移動します。
    if (this._gcSpreadGrid.ActiveRowIndex == this._gcSpreadGrid.RowCount - 1 && this._gcSpreadGrid.ActiveColumnIndex == this._gcSpreadGrid.ColumnCount - 1)
    {
      TraversalRequest tRequest = new TraversalRequest(FocusNavigationDirection.Next);
      UIElement keyboardFocus = Keyboard.FocusedElement as UIElement;
      if (keyboardFocus != null)
      {
        keyboardFocus.MoveFocus(tRequest);
      }
      return;
    }
    //RowやCellモードの場合
    if (this._gcSpreadGrid.SelectionUnit == GrapeCity.Windows.SpreadGrid.SelectionUnit.Row || this._gcSpreadGrid.SelectionUnit == GrapeCity.Windows.SpreadGrid.SelectionUnit.Cell)
    {
      //行の最後のセルの場合は、アクティブセルを次の行の最初のセルに移動します
      if (this._gcSpreadGrid.ActiveColumnIndex == this._gcSpreadGrid.ColumnCount - 1)
      {
        this._gcSpreadGrid.ActiveCellPosition = new GrapeCity.Windows.SpreadGrid.CellPosition(this._gcSpreadGrid.ActiveRowIndex + 1, 0);
        return;
      }
      //現在の行内の次のセルへ移動
      else
      {
        this._gcSpreadGrid.ActiveCellPosition = new GrapeCity.Windows.SpreadGrid.CellPosition(this._gcSpreadGrid.ActiveRowIndex, this._gcSpreadGrid.ActiveColumnIndex + 1);
      }
    }
    //Columnモードの場合
    if (this._gcSpreadGrid.SelectionUnit == GrapeCity.Windows.SpreadGrid.SelectionUnit.Column)
    {
      //列の最後のセルの場合は、アクティブセルを次の列の最初のセルに移動します
      if (this._gcSpreadGrid.ActiveRowIndex == this._gcSpreadGrid.RowCount - 1)
      {
        this._gcSpreadGrid.ActiveCellPosition = new GrapeCity.Windows.SpreadGrid.CellPosition(0, this._gcSpreadGrid.ActiveColumnIndex + 1);
        return;
      }
      //現在の列内の次のセルへ移動
      else
      {
        this._gcSpreadGrid.ActiveCellPosition = new GrapeCity.Windows.SpreadGrid.CellPosition(this._gcSpreadGrid.ActiveRowIndex + 1, this._gcSpreadGrid.ActiveColumnIndex);
      }
    }
  }
}