The Backyard - WinFormDataGridKeyHandling Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
!George Shepherdのページ
サブクラス化して、ProcessKeyPreviewをオーバーライドするのが良いかも。
http://www.syncfusion.com/FAQ/WinForms/FAQ_c44c.asp#q755q
http://www.syncfusion.com/FAQ/WinForms/FAQ_c44c.asp#q836q
http://www.syncfusion.com/FAQ/WinForms/FAQ_c44c.asp#q791q
!The Scarms.net Code Library
DataGridTableStyleからTextBoxのインスタンスを抜き出してデリゲートを注入する。
ただし、F2やEnterには有効ではなかった。
http://www.thescarms.com/dotNet/LimitKeys.asp
!VB.NET用クラス例
以下のようなクラスを作り、デザイナが生成したDataGridの定義とコンストラクタの呼び出しをこのクラスで置き換える(手作業が必要)
Friend Class MyDataGrid
Inherits DataGrid
Friend Event keyEvent As KeyEventHandler
Friend Sub AddKeyEvent(ByVal handler As KeyEventHandler)
AddHandler keyEvent, handler
End Sub
Friend Sub RemoveKeyEvent(ByVal handler As KeyEventHandler)
RemoveHandler keyEvent, handler
End Sub
'この例では、Enterキーの場合、デリゲートを呼び出す。
'もしセルが編集モードであれば、編集を確定する。
Protected Overrides Function ProcessCmdKey( _
ByRef msg As Message, _
ByVal keyData As Keys _
) As Boolean
Debug.WriteLine("key=" & keyData.ToString())
If keyData = Keys.Return Then
Dim abort As Boolean = True
If BeginEdit(TableStyles(0).GridColumnStyles(CurrentCell.ColumnNumber), CurrentCell.RowNumber) = False Then
abort = False
End If
EndEdit(TableStyles(0).GridColumnStyles(CurrentCell.ColumnNumber), CurrentCell.RowNumber, abort)
RaiseEvent keyEvent(Me, New KeyEventArgs(keyData))
Return True
End If
Return MyBase.ProcessCmdKey(msg, keyData)
End Function
End Class
!FormでDataGridの入力検証をセル単位に行う
これはだめ。カーソルの上下移動の場合、同一TextBoxが利用されるため、検証は走らない。また、この後、CancelEventArgsのハンドリングが行われないため、意味を持たない。
----
以下のコードをForm_Loadなどに組み込む。なお、gridがDataGridのフィールド名で、grid_Validatingが検証メソッド名
Dim dbt As DataGridTextBoxColumn
Dim i As Int16
For i = 1 To 9
dbt = CType(grid.TableStyles(0).GridColumnStyles(i), DataGridTextBoxColumn)
dbt.TextBox.CausesValidation = True
AddHandler dbt.TextBox.Validating, AddressOf grid_Validating
Next
検証処理を記述する
Private Sub grid_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ItemGrid.Validating
Dim val As String
val = PomLine.Tables(0).Rows(grid.CurrentCell.RowNumber).ItemArray(grid.CurrentCell.ColumnNumber)
' 検証処理
End Sub
サブクラス化して、ProcessKeyPreviewをオーバーライドするのが良いかも。
http://www.syncfusion.com/FAQ/WinForms/FAQ_c44c.asp#q755q
http://www.syncfusion.com/FAQ/WinForms/FAQ_c44c.asp#q836q
http://www.syncfusion.com/FAQ/WinForms/FAQ_c44c.asp#q791q
!The Scarms.net Code Library
DataGridTableStyleからTextBoxのインスタンスを抜き出してデリゲートを注入する。
ただし、F2やEnterには有効ではなかった。
http://www.thescarms.com/dotNet/LimitKeys.asp
!VB.NET用クラス例
以下のようなクラスを作り、デザイナが生成したDataGridの定義とコンストラクタの呼び出しをこのクラスで置き換える(手作業が必要)
Friend Class MyDataGrid
Inherits DataGrid
Friend Event keyEvent As KeyEventHandler
Friend Sub AddKeyEvent(ByVal handler As KeyEventHandler)
AddHandler keyEvent, handler
End Sub
Friend Sub RemoveKeyEvent(ByVal handler As KeyEventHandler)
RemoveHandler keyEvent, handler
End Sub
'この例では、Enterキーの場合、デリゲートを呼び出す。
'もしセルが編集モードであれば、編集を確定する。
Protected Overrides Function ProcessCmdKey( _
ByRef msg As Message, _
ByVal keyData As Keys _
) As Boolean
Debug.WriteLine("key=" & keyData.ToString())
If keyData = Keys.Return Then
Dim abort As Boolean = True
If BeginEdit(TableStyles(0).GridColumnStyles(CurrentCell.ColumnNumber), CurrentCell.RowNumber) = False Then
abort = False
End If
EndEdit(TableStyles(0).GridColumnStyles(CurrentCell.ColumnNumber), CurrentCell.RowNumber, abort)
RaiseEvent keyEvent(Me, New KeyEventArgs(keyData))
Return True
End If
Return MyBase.ProcessCmdKey(msg, keyData)
End Function
End Class
!FormでDataGridの入力検証をセル単位に行う
これはだめ。カーソルの上下移動の場合、同一TextBoxが利用されるため、検証は走らない。また、この後、CancelEventArgsのハンドリングが行われないため、意味を持たない。
----
以下のコードをForm_Loadなどに組み込む。なお、gridがDataGridのフィールド名で、grid_Validatingが検証メソッド名
Dim dbt As DataGridTextBoxColumn
Dim i As Int16
For i = 1 To 9
dbt = CType(grid.TableStyles(0).GridColumnStyles(i), DataGridTextBoxColumn)
dbt.TextBox.CausesValidation = True
AddHandler dbt.TextBox.Validating, AddressOf grid_Validating
Next
検証処理を記述する
Private Sub grid_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ItemGrid.Validating
Dim val As String
val = PomLine.Tables(0).Rows(grid.CurrentCell.RowNumber).ItemArray(grid.CurrentCell.ColumnNumber)
' 検証処理
End Sub