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

文書番号 : 85073     文書種別 : 使用方法     登録日 : 2020/03/31     最終更新日 : 2020/03/31
文書を印刷する
対象製品
SPREAD for WPF 3.0J
詳細
.NET Frameworkの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)));
}

なお、GcSpreadGridでは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);
            }
        }
    }
}
関連情報