【数値型セル】 スピンボタンによる値の増減をキーボード入力(上下カーソルキー)で行うことは出来ますか?
対象製品
SPREAD for Windows Forms 7.0J
詳細
上下カーソルキーに定義されているデフォルトの入力マップを制御し、Keyイベントにて値の増減を行う各メソッド呼び出しを行うことで可能となります。具体的な実装方法については以下をご参照ください。
◎サンプルコード(VB)
◎サンプルコード(C#)
※サンプルコード内の『SpinUpNotifyメソッド』および『SpinDownNotifyメソッド』については、SPREAD内部にて使用されているもので一般的な機能としては提供されていません。また、製品ヘルプにも記載がないことを予めご了承ください。
※サンプルコードでは入力マップの定義を編集開始/終了のタイミングによって適宜切り替えていますが、上下キーによるセル移動を行わない場合には必要ありません( [Ctrl]+[上下キー] によってセル移動が可能です)。 なお、このような入力マップの制御を行う場合は予め十分な動作検証を行ってください。
※サンプルコードでは入力マップの定義を編集開始/終了のタイミングによって適宜切り替えていますが、上下キーによるセル移動を行わない場合には必要ありません( [Ctrl]+[上下キー] によってセル移動が可能です)。 なお、このような入力マップの制御を行う場合は予め十分な動作検証を行ってください。
◎サンプルコード(VB)
Imports FarPoint.Win.Spread
Imports FarPoint.Win.Spread.CellType
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'数値型セル定義
Dim numCell As New NumberCellType
numCell.SpinButton = True
numCell.SpinWrap = True
FpSpread1.ActiveSheet.Columns(0).CellType = numCell
End Sub
Private Sub FpSpread1_EditModeOn(ByVal sender As Object, ByVal e As System.EventArgs) Handles FpSpread1.EditModeOn
'KeyUpイベントをハンドル
AddHandler FpSpread1.EditingControl.KeyUp, AddressOf FpSpread1_KeyUp
Dim iRow As Integer = FpSpread1.ActiveSheet.ActiveRowIndex
Dim iCol As Integer = FpSpread1.ActiveSheet.ActiveColumnIndex
'数値型セルが編集モードになった場合、デフォルトの上下キー動作を無効とする
If TypeOf (FpSpread1.ActiveSheet.GetCellType(iRow, iCol)) Is NumberCellType Then
Dim im As InputMap = FpSpread1.GetInputMap(InputMapMode.WhenAncestorOfFocused)
im.Put(New Keystroke(Keys.Up, Keys.None), SpreadActions.None)
im.Put(New Keystroke(Keys.Down, Keys.None), SpreadActions.None)
End If
End Sub
Private Sub FpSpread1_EditModeOff(ByVal sender As Object, ByVal e As System.EventArgs) Handles FpSpread1.EditModeOff
'KeyUpイベントをハンドル解除
RemoveHandler FpSpread1.EditingControl.KeyUp, AddressOf FpSpread1_KeyUp
Dim iRow As Integer = FpSpread1.ActiveSheet.ActiveRowIndex
Dim iCol As Integer = FpSpread1.ActiveSheet.ActiveColumnIndex
'数値型セルが非編集モードになった場合、デフォルトの上下キー動作をデフォルトに戻す
If TypeOf (FpSpread1.ActiveSheet.GetCellType(iRow, iCol)) Is NumberCellType Then
Dim im As InputMap = FpSpread1.GetInputMap(InputMapMode.WhenAncestorOfFocused)
im.Put(New Keystroke(Keys.Up, Keys.None), SpreadActions.MoveToPreviousRow)
im.Put(New Keystroke(Keys.Down, Keys.None), SpreadActions.MoveToNextRow)
End If
End Sub
Private Sub FpSpread1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles FpSpread1.KeyUp
Dim iRow As Integer = FpSpread1.ActiveSheet.ActiveRowIndex
Dim iCol As Integer = FpSpread1.ActiveSheet.ActiveColumnIndex
'数値型セルが編集モードの場合、上下キー押下によってをスピンボタンを動作させる
If TypeOf (FpSpread1.ActiveSheet.GetCellType(iRow, iCol)) Is NumberCellType And FpSpread1.EditMode Then
If e.KeyCode = Keys.Up Then
CType(FpSpread1.EditingControl, GeneralEditor).SpinUpNotify(FpSpread1)
ElseIf e.KeyCode = Keys.Down Then
CType(FpSpread1.EditingControl, GeneralEditor).SpinDownNotify(FpSpread1)
End If
End If
End Sub
Imports FarPoint.Win.Spread.CellType
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'数値型セル定義
Dim numCell As New NumberCellType
numCell.SpinButton = True
numCell.SpinWrap = True
FpSpread1.ActiveSheet.Columns(0).CellType = numCell
End Sub
Private Sub FpSpread1_EditModeOn(ByVal sender As Object, ByVal e As System.EventArgs) Handles FpSpread1.EditModeOn
'KeyUpイベントをハンドル
AddHandler FpSpread1.EditingControl.KeyUp, AddressOf FpSpread1_KeyUp
Dim iRow As Integer = FpSpread1.ActiveSheet.ActiveRowIndex
Dim iCol As Integer = FpSpread1.ActiveSheet.ActiveColumnIndex
'数値型セルが編集モードになった場合、デフォルトの上下キー動作を無効とする
If TypeOf (FpSpread1.ActiveSheet.GetCellType(iRow, iCol)) Is NumberCellType Then
Dim im As InputMap = FpSpread1.GetInputMap(InputMapMode.WhenAncestorOfFocused)
im.Put(New Keystroke(Keys.Up, Keys.None), SpreadActions.None)
im.Put(New Keystroke(Keys.Down, Keys.None), SpreadActions.None)
End If
End Sub
Private Sub FpSpread1_EditModeOff(ByVal sender As Object, ByVal e As System.EventArgs) Handles FpSpread1.EditModeOff
'KeyUpイベントをハンドル解除
RemoveHandler FpSpread1.EditingControl.KeyUp, AddressOf FpSpread1_KeyUp
Dim iRow As Integer = FpSpread1.ActiveSheet.ActiveRowIndex
Dim iCol As Integer = FpSpread1.ActiveSheet.ActiveColumnIndex
'数値型セルが非編集モードになった場合、デフォルトの上下キー動作をデフォルトに戻す
If TypeOf (FpSpread1.ActiveSheet.GetCellType(iRow, iCol)) Is NumberCellType Then
Dim im As InputMap = FpSpread1.GetInputMap(InputMapMode.WhenAncestorOfFocused)
im.Put(New Keystroke(Keys.Up, Keys.None), SpreadActions.MoveToPreviousRow)
im.Put(New Keystroke(Keys.Down, Keys.None), SpreadActions.MoveToNextRow)
End If
End Sub
Private Sub FpSpread1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles FpSpread1.KeyUp
Dim iRow As Integer = FpSpread1.ActiveSheet.ActiveRowIndex
Dim iCol As Integer = FpSpread1.ActiveSheet.ActiveColumnIndex
'数値型セルが編集モードの場合、上下キー押下によってをスピンボタンを動作させる
If TypeOf (FpSpread1.ActiveSheet.GetCellType(iRow, iCol)) Is NumberCellType And FpSpread1.EditMode Then
If e.KeyCode = Keys.Up Then
CType(FpSpread1.EditingControl, GeneralEditor).SpinUpNotify(FpSpread1)
ElseIf e.KeyCode = Keys.Down Then
CType(FpSpread1.EditingControl, GeneralEditor).SpinDownNotify(FpSpread1)
End If
End If
End Sub
◎サンプルコード(C#)
using FarPoint.Win.Spread;
using FarPoint.Win.Spread.CellType;
private void Form1_Load(object sender, System.EventArgs e)
{
//数値型セル定義
NumberCellType numCell = new NumberCellType();
numCell.SpinButton = true;
numCell.SpinWrap = true;
fpSpread1.ActiveSheet.Columns[0].CellType = numCell;
}
private void fpSpread1_EditModeOn(object sender, System.EventArgs e)
{
//KeyUpイベントをハンドル
fpSpread1.EditingControl.KeyUp += new KeyEventHandler(this.fpSpread1_KeyUp);
int iRow = fpSpread1.ActiveSheet.ActiveRowIndex;
int iCol = fpSpread1.ActiveSheet.ActiveColumnIndex;
//数値型セルが編集モードになった場合、デフォルトの上下キー動作を無効とする
if (fpSpread1.ActiveSheet.GetCellType(iRow, iCol) is NumberCellType)
{
InputMap im = fpSpread1.GetInputMap(InputMapMode.WhenAncestorOfFocused);
im.Put(new Keystroke(Keys.Up , Keys.None), SpreadActions.None);
im.Put(new Keystroke(Keys.Down, Keys.None), SpreadActions.None);
}
}
private void fpSpread1_EditModeOff(object sender, System.EventArgs e)
{
//KeyUpイベントをハンドル解除
fpSpread1.EditingControl.KeyUp -= new KeyEventHandler(this.fpSpread1_KeyUp);
int iRow = fpSpread1.ActiveSheet.ActiveRowIndex;
int iCol = fpSpread1.ActiveSheet.ActiveColumnIndex;
//数値型セルが非編集モードになった場合、デフォルトの上下キー動作をデフォルトに戻す
if (fpSpread1.ActiveSheet.GetCellType(iRow, iCol) is NumberCellType)
{
InputMap im = fpSpread1.GetInputMap(InputMapMode.WhenAncestorOfFocused);
im.Put(new Keystroke(Keys.Up , Keys.None), SpreadActions.MoveToPreviousRow);
im.Put(new Keystroke(Keys.Down, Keys.None), SpreadActions.MoveToNextRow);
}
}
private void fpSpread1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{
int iRow = fpSpread1.ActiveSheet.ActiveRowIndex;
int iCol = fpSpread1.ActiveSheet.ActiveColumnIndex;
//数値型セルが編集モードの場合、上下キー押下によってをスピンボタンを動作させる
if (fpSpread1.ActiveSheet.GetCellType(iRow, iCol) is NumberCellType && fpSpread1.EditMode)
{
if (e.KeyCode == Keys.Up)
((GeneralEditor)fpSpread1.EditingControl).SpinUpNotify(fpSpread1);
else if (e.KeyCode == Keys.Down)
((GeneralEditor)fpSpread1.EditingControl).SpinDownNotify(fpSpread1);
}
}
using FarPoint.Win.Spread.CellType;
private void Form1_Load(object sender, System.EventArgs e)
{
//数値型セル定義
NumberCellType numCell = new NumberCellType();
numCell.SpinButton = true;
numCell.SpinWrap = true;
fpSpread1.ActiveSheet.Columns[0].CellType = numCell;
}
private void fpSpread1_EditModeOn(object sender, System.EventArgs e)
{
//KeyUpイベントをハンドル
fpSpread1.EditingControl.KeyUp += new KeyEventHandler(this.fpSpread1_KeyUp);
int iRow = fpSpread1.ActiveSheet.ActiveRowIndex;
int iCol = fpSpread1.ActiveSheet.ActiveColumnIndex;
//数値型セルが編集モードになった場合、デフォルトの上下キー動作を無効とする
if (fpSpread1.ActiveSheet.GetCellType(iRow, iCol) is NumberCellType)
{
InputMap im = fpSpread1.GetInputMap(InputMapMode.WhenAncestorOfFocused);
im.Put(new Keystroke(Keys.Up , Keys.None), SpreadActions.None);
im.Put(new Keystroke(Keys.Down, Keys.None), SpreadActions.None);
}
}
private void fpSpread1_EditModeOff(object sender, System.EventArgs e)
{
//KeyUpイベントをハンドル解除
fpSpread1.EditingControl.KeyUp -= new KeyEventHandler(this.fpSpread1_KeyUp);
int iRow = fpSpread1.ActiveSheet.ActiveRowIndex;
int iCol = fpSpread1.ActiveSheet.ActiveColumnIndex;
//数値型セルが非編集モードになった場合、デフォルトの上下キー動作をデフォルトに戻す
if (fpSpread1.ActiveSheet.GetCellType(iRow, iCol) is NumberCellType)
{
InputMap im = fpSpread1.GetInputMap(InputMapMode.WhenAncestorOfFocused);
im.Put(new Keystroke(Keys.Up , Keys.None), SpreadActions.MoveToPreviousRow);
im.Put(new Keystroke(Keys.Down, Keys.None), SpreadActions.MoveToNextRow);
}
}
private void fpSpread1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{
int iRow = fpSpread1.ActiveSheet.ActiveRowIndex;
int iCol = fpSpread1.ActiveSheet.ActiveColumnIndex;
//数値型セルが編集モードの場合、上下キー押下によってをスピンボタンを動作させる
if (fpSpread1.ActiveSheet.GetCellType(iRow, iCol) is NumberCellType && fpSpread1.EditMode)
{
if (e.KeyCode == Keys.Up)
((GeneralEditor)fpSpread1.EditingControl).SpinUpNotify(fpSpread1);
else if (e.KeyCode == Keys.Down)
((GeneralEditor)fpSpread1.EditingControl).SpinDownNotify(fpSpread1);
}
}
関連情報
キーワード
「キー操作」