作成日: 2022/07/06 最終更新日: 2022/07/06
文書種別
使用方法
詳細
.NET FrameworkのInputBindingsクラスを使用して特定のキー(ショートカットキー)にMoveNextThenControlコマンドを設定することで、最終セルで[Tab]キーを押下された際に次のコントロールに移動することができます。
◎サンプルコード(VB)
◎サンプルコード(C#)
なお、GcSpreadGridでは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
◎サンプルコード(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);
}
}
}
}
関連情報