WinFormDataGridKeyHandling
George Shepherdのページ
サブクラス化して、ProcessKeyPreviewをオーバーライドするのが良いかも。
http://www.syncfusion.com/FAQ/WinForms/FAQ_c44c.asp#q755q
The Scarms.net Code Library
DataGridTableStyleからTextBoxのインスタンスを抜き出してデリゲートを注入する。
ただし、F2やEnterには有効ではなかった。
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
Keyword(s):
References: