掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
DataGridで項目スキップ&入力チェックを行う方法 (ID:123458)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
まず、例外エラーを発生させなければいけない場面ではないと思いますが…。 [Throw ステートメント]で作成した例外は、適切な例外処理コードが見つかる まで呼び出し履歴をさかのぼりますから、適切な例外処理で拾う必要がありますし、 逆に本当にシステムエラーなどが起きた時に、エラーを無視して処理が継続しない ようにコーディングする必要があります。 また、質問の内容から入力チェックをした後、セルを移動させないような処理を 実行する事になりそうですから、例外エラーで処理を止めるべきではありません。 例外エラーを使わない設計に変更すべきです。 具体的にどうするか? 1:ユーザ定義のイベントを定義しておき、ProcessCmdKey メソッド内で発生させます。 (この時にイベントキャンセル用の Boolean 型の引数を付けておくと便利です。) これは何も特別な考え方ではありません。例えばテキストボックスで入力チェック を行う場合、TextChanged や Validating イベントを利用して入力チェックし、 処理を継続します。構造化プログラミングの基本は、既に存在する処理を十分に 理解し、その概念と共通の概念を持ったコーディングをする事です。その場しのぎの 独自のコーディングは、後々自分の首を締める事になります。 2:次にそのイベントを拾い入力チェックします。 3:入力値エラーの場合、イベントキャンセル用のフラグを変更します。 (イメージとしてはフォームの Closing イベントで e.Cancel = True とする感じ) 4:フラグに応じて ProcessCmdKey メソッドに戻りコマンドキーを処理します。 提示されたコードではここにコマンドキーのキャンセル処理が一切書かれていません。 ProcessCmdKey メソッドを継承する意味が半減しています。継承時の注意なども 書かれていますので、ヘルプでどのような機能が用意されているか十分に確認して下さい。 サンプルとして [PAPA'n VB (ぱぱんぶぃびぃ) - VB.NET Tips データグリッドの行削除の直前に確認する] http://www.sugi-family.net/papanvb/vbnet_tips.php?cate=20&tips=20002 を解析してみて下さい。 >で入力値エラーであっても、ProcessCmdKeyで記述している >> Me.CurrentCell = New DataGridCell(Cel.RowNumber, 2) >が有効になってしまいます。 入力値エラーにしてもコマンドキーをキャンセルするようなコードが書かれていないから 当然の結果です。 >ちなみに >> Me.CurrentCell = New DataGridCell(Cel.RowNumber, 2) >の部分が >> SendKeys.Send("{Tab}") 'TAB >ですと、エラーが解消されるまでセル移動されませんでした。 前者はサブプロシージャから別のサブプロシージャを呼び出したようなもの。 呼び出した時点でその処理が先に処理されます。 Private Sub a() '[1] Call b() '[3] End Sub Private Sub b() '[2] End Sub 後者はキーストロークをアプリケーションに送信するメソッドですので OS側で{Tab}キーが押されたような処理を再現します。言うなれば ボタン連打した時に2回目以降のボタン押下処理がスタックされ、1回目の ボタン押下の処理が終了するか、OSに制御が戻るまで実行されないのと 同じです。当然の結果です。イベントがどの順番で起こり、スタックされ、 実行されているかを考えて下さい。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.