- ベストアンサー
DataGridViewで入力チェック後、フォーカスをあてたい
お世話になります。 現在VB2005で開発中なのですが、DataGridViewの処理で躓いております。 DataGridViewには「氏名」「住所」「生年月日」を入力できるようにしており、全ての項目において入力必須としています。 よって、どれか一つでも入力がなかった場合はエラーメッセージを表示させ、メッセージ表示後に該当項目のセルにフォーカスをあてたいと考え、ロジックを組んでおります。 仮に「氏名」が空白で、次の行の任意セルをクリックした場合、RowValidatedイベントで各セルに対し入力チェックを行い、メッセージを表示させた後にCurrentCellを空白だったCellにし、さらにEditModeで編集可能状態にすればいいと考えていたのですが、結果は最後にクリックした任意セルにフォーカスが移ってしまいます。 入力チェックを発生させるイベントに問題があるのか、カレントセルにフォーカスを当てる処理で問題があるのかで悩んでいる状態です。 どなたか心当たりがあれば教授願いたいです。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>これはフォーカスを当てずに、メッセージで対処する方法と考えてよろしいでしょうか? 他のセルに移動しようとした時(フォーカスを失った時)にチェックをしてます。 不正ならメッセージを出してフォーカスの移動をキャンセルしてます。 >どれか一つでも入力がなかった場合はエラーメッセージを表示させ、メッセージ表示後に該当項目のセルにフォーカスをあてたいと考え、ロジックを組んでおります。 と言う事だったので、行ではなく1セル単位で、 CellValidating:セルが入力フォーカスを失い、内容の検証が有効になった場合に発生します。 でチェックをして、今回はどのセルでも空白だったらe.cancel=trueでフォーカスを戻しています。 「エラーメッセージを表示させ」とあるので、エラーメッセージを出してます。 Select Case e.ColumnIndex Case 0 Case 1 Case 2 End Select でもよかったんですが、メッセージは列見出しを使っています。
その他の回答 (3)
- fumufumu_2006
- ベストアンサー率66% (163/245)
こんなのではどうでしょうか? Private Sub DataGridView1_CellValidating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating If Not DataGridView1.Rows(e.RowIndex).IsNewRow Then '新しいレコードの行ならチェックしない If e.FormattedValue.ToString.Length = 0 Then '空白なら MsgBox(DataGridView1.Columns(e.ColumnIndex).HeaderText & "は必須です") '列ヘッダを表示 e.Cancel = True End If End If End Sub
- unamana19
- ベストアンサー率62% (56/89)
CellValidatingでイベントでエラーチェックを行い、 エラーであれば、e.Cancel = Trueでイベントをキャンセル すればいいのかな?
お礼
unamana19さん、ありがとうございます。 CellValidatingイベント内で「e.cancel = true」を定義できませんでした・・・ VB2005だと出来ないのでしょうか? ちなみに「Exit Sub」でイベントを抜けても同様に、指定したセルへのフォーカスは出来ませんでした。
- unamana19
- ベストアンサー率62% (56/89)
CellValidatedイベントでは駄目でしょうか?
お礼
unamana19さん、ありがとうございます。 CellValidatedイベントやRowLeaveイベントでも試みましたが、結果は同様でした。 カレントセルを指定(チェック対象セル)し、イベント処理内でMsgBoxで確認した段階では、指定したセルのアドレスが表示されたのですが、イベントを抜けてしまうとクリックしたセルに戻ってしまいます。 どこかでクリックしたセルのアドレスを保有していて、イベントを抜けた後にそちらを優先してしまうのでしょうか・・・
お礼
fumufumu_2006さん、ありがとうございます。 これはフォーカスを当てずに、メッセージで対処する方法と考えてよろしいでしょうか? なるべくならエラー個所をすぐに直させたいので、フォーカスで対処したかったのですが・・・方法がなければ上記の方法で対処したいと考えております。 ありがとうございました。