最終セルで[Tab]キーを押下された際に次のコントロールに移動したい
対象製品
SPREAD for WPF 1.0J
詳細
InputBindingsを使用してキーボードの入力マップ(ショートカットキー)でMoveNextThenControlを設定することで、最終セルで[Tab]キーを押下された際に次のコントロールに移動することができます。
◎サンプルコード(VB)
◎サンプルコード(C#)
なお、SPREADではSelectionUnitをRowやColumnに設定した場合、アクティブセルの移動は、次の行/列やコントロールではなく、現在選択されている行や列内の移動となります。この場合は、以下に示されているようなカスタムコマンドを実装する必要があります。
◎サンプルコード(VB)
◎サンプルコード(C#)
◎サンプルコード(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
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)));
}
{
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
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);
}
}
}
}
{
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);
}
}
}
}