- PR -

DataGridViewのイベント発生のタイミングについて

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-03-16 21:08
引用:

Ahfさんの書き込み (2007-03-16 19:03) より:
値が確定するのは、
フォーカスが移るタイミングと、CommitEditを行ったタイミングだと思います。

#EndEditはどうだったか????

ですので、オーバーライドしたロジック次第かと。
オーバーライドしていないなら、他のValidating系のイベントと同様のタイミング
なんですけどね。


だから
『値の格納とカレント セルの移動ってのが何(イベント)を指しているのかよくわかんないけど』と、書いています。

しかし、「移動の途中で発生している」とあるので、移動のときにキャンセルしていないことがわかります。ここから逆に、このケースに限っては、移動することによって確定していると考えてよいと思います。

まあ、どの様に確定をさせているか、おそらく本人が把握していないと考えられるので、Ahfさんがおっしゃるように、自分がなにを指示しているのか把握することが第一なんですけど。
_________________
さよこ
ベテラン
会議室デビュー日: 2005/10/13
投稿数: 78
投稿日時: 2007-03-17 09:29
ありがとうございます。
返信遅くなってすみません。風邪で寝込んでいました。
お医者さんからタミフルを勧められましたが、小心者なので、断りました。
オーバーライドしたコードは、
Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
 If (keyData And Keys.KeyCode) = Keys.Enter Then
 Return Me.ProcessRightkey(keyData)
End If
 Return MyBase.ProcessDialogKey(keyData)
End Function

Protected Overrides Function ProcessDataGridViewKey(ByVal e As System.Windows.Forms.KeyEventArgs) As Boolean
 If e.KeyCode = Keys.Enter Then
 Return Me.ProcessRightkey(e.KeyData)
End If
Return MyBase.ProcessDataGridViewKey(e)
End Function

Public Shadows Function ProcessRightkey(ByVal keyData As Keys) As Boolean
 If (keyData And Keys.KeyCode) = Keys.Enter Then
 If MyBase.CurrentCell.ColumnIndex = MyBase.Columns.Count - 1 _
 And MyBase.CurrentCell.RowIndex + 1 <= MyBase.Rows.Count - 1 Then
MyBase.CurrentCell = MyBase.Rows((MyBase.CurrentCell.RowIndex + 1)).Cells(0)
ElseIf MyBase.CurrentCell.ColumnIndex < MyBase.Columns.Count - 1 Then
MyBase.CurrentCell = MyBase.Rows(MyBase.CurrentCell.RowIndex).Cells(MyBase.CurrentCell.ColumnIndex + 1)
End If
 End If
End Function
どこだったかのページに載っていたサンプルコードを元にしました。
この中の ProcessRightkeyの途中でCellValueChangedイベントが走ります。
ぽぴ王子さんのおっしゃるように、CellValueChangedイベントのColumnIndex と RowIndexで値を確するのがよいのでしょうか。
不正な値だったら、セルの移動が行われないようにしたいのですけど。


Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2007-03-17 21:16
提示していただいたサンプルコードの中でProcessRightKeyでイベントが
発生しているというのは当たっていますよ。
引用:
Jittaさんの書き込み(2007-03-16 21:08)より:
このケースに限っては、移動することによって確定していると考えてよいと思います。


というのがポイント、というか答えですね。

私もこのロジックを元にDataGridViewに色々手を入れたことがあるのですが、
ProcessRightKeyの制御では、もう少し加味しないといけないと思います。
編集状態の事が考慮されていない状態なんですよね、このロジック。
そこは実際に利用する側が考慮してあげるところですね。

なお、CellValueChangedイベントは確定後のイベントですので
引用:
さよこさんの書き込み(2007-03-17 09:29)より:
不正な値だったら、セルの移動が行われないようにしたいのですけど。


という判断は違うイベントになると思います。CellValidatingイベントかな?

後はそのあたりのイベントと、ProcessRightKeyメソッドの動きを一緒に追いかけてみて
ください。そうすると多分流れが読めると思います。

>Jittaさん
どうも内容を読みとるのが足りなかったようで申し訳ないです。
さよこ
ベテラン
会議室デビュー日: 2005/10/13
投稿数: 78
投稿日時: 2007-03-19 14:32
ありがとうございます。
少しづつ動きがわかってきました。
CellValueChangedイベントは、たまたま都合の良いタイミングで発生しているのではなく、ProcessRightKey内のコードでカレントセルを動かすことによって、値が確定されたと見なされ、発生しているわけですね。
ということは、ProcessRightKeyのコード内で、カレントセルの移動を行うコードの前に入力値のチェックなどを行えば良いわけですね。
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2007-03-19 15:08
最終的な結果としては、
引用:
さよこさんの書き込み(2007-03-19 14:32)より:
ProcessRightKeyのコード内で、カレントセルの移動を行うコードの前に入力値のチェックなどを行えば良いわけですね。


でいいんですけど、入力値のチェックは本来Validate系のイベントで行うのがベターだと思います。

個人的な見解なので、問題ないかどうかは微妙ですが、
ProcessRightKeyでは編集状態を操作し無事に確定できた際にのみカレントセルを移動する、
というのがいいんじゃないでしょうか。
さよこ
ベテラン
会議室デビュー日: 2005/10/13
投稿数: 78
投稿日時: 2007-03-19 21:00
ありがとうございます。
>Validate
なるほど。
本来、在るべき場所にコードを書いた方が後々のためにも良いですね。
各イベントの発生順序とか、勉強します。

スキルアップ/キャリアアップ(JOB@IT)