Create  Edit  Diff  FrontPage  Index  Search  Changes  Login

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