- ベストアンサー
DataGridViewでの入力チェック
DataGridViewで入力チェックを行いたいのですが、移動先のセルが移動元のセルよりも下の列あるいは右下の場合だけ入力チェックをしたいのですが、どうしたらよいでしょうか? CellValidatingイベント等では、移動元のセル情報は取得できるのですが、移動先のセル情報が取得できません。 根本的にこのようなチェック機能自体問題があるでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。 恐らく、セル移動が終了しないうちに、更に別のセルに移動させようとして いるから、エラーとなるのでしょう。 やり方としては汚いですが(汗)、セル移動専用のInterval=10とかの Timerを準備しておいて、移動したい場合のみTimerを起動し、 Timer.Tickイベント側で、Timerを停止してセル移動を行うって手も あります。 DataGridViewは色々クセがありますので、こういう手で逃げるのも ある意味楽で良いです。但しちゃんとコメント書いとかないと訳わかんなく なりますし、他の人が見ても謎のソースになります(滝汗)。 …サブクラスとか作って綺麗に処理書ける方がいらっしゃったら補足お願いします…
その他の回答 (1)
- K-Sogacchi
- ベストアンサー率53% (50/93)
少ししか検証してない上に、もっと効率的なやり方もあるかもですが、 DataGridViewのセル移動では、CellLeaveイベントが発生してから CellEnterイベントが発生しているようなので、CellLeaveの時点で CellのRow,Columnをモジュールレベル以上のスコープを持つ変数を使用して 憶えておき、CellEnterの時点で、それと移動後のRow,Columnを比較すれば、 何とかなる気は します。 (この程度だと気付いてるかもしれませんが…) ただ、このやり方だと、例えば条件によってセル移動をキャンセルしたり する場合は、チラついたり動作が遅くなったりする可能性もあると思います。 あと、他のコントロールにフォーカスが移動した場合も、CellLeaveは 発生しますので、その場合の動作は、適宜アレンジしてください。
お礼
ご回答ありがとうございます。 ご指摘頂いたやり方も試していたのですが、セル移動のキャンセル がうまく出来ないので断念しておりました。 CellEnterイベントでセル移動のキャンセルが発生した場合に、 保存しておいたRow、Column情報を、CurrentCellにセットすると エラーが発生してしまいます。 どうしても回避できなかったので、CellValidatingイベントで 入力チェックが行えないものかと考えておりました。 CurrentCellでフォーカスを戻すやり方がまずいのでしょうか?
お礼
早々のご返事ありがとうございます。 Timerで逃げるのも手かもしれませんね。 一度試してみます。 どうもありがとうございます。