- - PR -
DataGridViewのイベント発生のタイミングについて
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-03-16 21:08
『値の格納とカレント セルの移動ってのが何(イベント)を指しているのかよくわかんないけど』と、書いています。 しかし、「移動の途中で発生している」とあるので、移動のときにキャンセルしていないことがわかります。ここから逆に、このケースに限っては、移動することによって確定していると考えてよいと思います。 まあ、どの様に確定をさせているか、おそらく本人が把握していないと考えられるので、Ahfさんがおっしゃるように、自分がなにを指示しているのか把握することが第一なんですけど。 _________________ | ||||||||
|
投稿日時: 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で値を確するのがよいのでしょうか。 不正な値だったら、セルの移動が行われないようにしたいのですけど。 | ||||||||
|
投稿日時: 2007-03-17 21:16
提示していただいたサンプルコードの中でProcessRightKeyでイベントが
発生しているというのは当たっていますよ。
というのがポイント、というか答えですね。 私もこのロジックを元にDataGridViewに色々手を入れたことがあるのですが、 ProcessRightKeyの制御では、もう少し加味しないといけないと思います。 編集状態の事が考慮されていない状態なんですよね、このロジック。 そこは実際に利用する側が考慮してあげるところですね。 なお、CellValueChangedイベントは確定後のイベントですので
という判断は違うイベントになると思います。CellValidatingイベントかな? 後はそのあたりのイベントと、ProcessRightKeyメソッドの動きを一緒に追いかけてみて ください。そうすると多分流れが読めると思います。 >Jittaさん どうも内容を読みとるのが足りなかったようで申し訳ないです。 | ||||||||
|
投稿日時: 2007-03-19 14:32
ありがとうございます。
少しづつ動きがわかってきました。 CellValueChangedイベントは、たまたま都合の良いタイミングで発生しているのではなく、ProcessRightKey内のコードでカレントセルを動かすことによって、値が確定されたと見なされ、発生しているわけですね。 ということは、ProcessRightKeyのコード内で、カレントセルの移動を行うコードの前に入力値のチェックなどを行えば良いわけですね。 | ||||||||
|
投稿日時: 2007-03-19 15:08
最終的な結果としては、
でいいんですけど、入力値のチェックは本来Validate系のイベントで行うのがベターだと思います。 個人的な見解なので、問題ないかどうかは微妙ですが、 ProcessRightKeyでは編集状態を操作し無事に確定できた際にのみカレントセルを移動する、 というのがいいんじゃないでしょうか。 | ||||||||
|
投稿日時: 2007-03-19 21:00
ありがとうございます。
>Validate なるほど。 本来、在るべき場所にコードを書いた方が後々のためにも良いですね。 各イベントの発生順序とか、勉強します。 |