TL;DR(要約)
- DataGridViewのカスタムセルを実装する場合にはまりやすい点
- 関連付けるコントロール自体がユーザーコントロールの場合には、入力処理が反映されないことがある
課題1
課題:キーボードで移動した場合に、独自コントロールの処理が反映されない
独自コントロールで、Validatingイベントで、編集が終わった後に、値チェック(最大、最小)と書式の処理を行っていた。
しかし、キーボードで移動した場合は、Validatingイベントが発生するタイミングが異なるため、独自コントロールから、DataGridViewに値が反映されなかった。
マウスで別セルを指定して移動した場合には反映された。
マウスで別セルを指定して移動
イベント | Me.Textの値 |
---|---|
OnTextChanged | 1 |
GetEditingControlFormattedValue | 1 |
OnTextChanged | 12 |
OnTextChanged | 123 |
OnLeave | 123 |
OnTextChanged | 123.00 |
OnValidating | 123.00 |
GetEditingControlFormattedValue | 123.00 |
GetEditingControlFormattedValue | 123.00 |
Enterキーで移動
イベント | Me.Textの値 |
---|---|
OnTextChanged | 1 |
GetEditingControlFormattedValue | 1 |
OnTextChanged | 12 |
OnTextChanged | 123 |
GetEditingControlFormattedValue | 123 |
GetEditingControlFormattedValue | 123 |
OnLeave | 123 |
OnTextChanged | 123.00 |
OnValidating | 123.00 |
解決策:OnValidatingイベントで上書き
Protected Overrides Sub OnValidating(e As CancelEventArgs)
MyBase.OnValidating(e)
_DataGridView.CurrentCell.Value = Me.Text
End Sub
上記の_DataGridView
は、EditingControlDataGridViewでセットされたもの。詳しくは、リソース参照。
'編集するセルがあるDataGridView
Public Property EditingControlDataGridView() As DataGridView _
Implements IDataGridViewEditingControl.EditingControlDataGridView
Get
Return Me._DataGridView
End Get
Set(ByVal value As DataGridView)
Me._DataGridView = value
End Set
End Property
課題2
課題:DataGridViewの表示書式を既定で変更したい
通貨型セルなどを実装した場合、既定で右寄せとしたい。
解決策:カスタム列のコンストラクタで指定する
既定値を設定するなどの方法があるが、カスタム列のコンストラクタで実装する方法が、紛れがない。(汎用性はなくなるが)
Public Sub New()
MyBase.New(New CcOldDataGridViewCurrencyCell())
'初期化処理があればここに記載
'右寄せ
Me.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
Me.DefaultCellStyle.Format = "#,0"
End Sub
リソース
■DataGridViewにMaskedTextBoxを表示する
https://dobon.net/vb/dotnet/datagridview/maskedtextboxcolumn.html