Create  Edit  Diff  FrontPage  Index  Search  Changes  Login

WinFormDataGridKeyHandling

George Shepherdのページ

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
Last modified:2011/07/13 23:22:28
Keyword(s):
References: