- PR -

SetFocusについて

投稿者投稿内容
のすけ
常連さん
会議室デビュー日: 2006/11/14
投稿数: 28
投稿日時: 2006-11-15 13:32
SetFocusについて質問させて頂きます。

<前提>
言語:ASP.NET 2.0 (VB.NET)
環境:VisualStudio2005

<要件>
画面上のボタンを押下したときに、テキストボックス入力値を文字種チェックし、エラーの場合は当該テキストボックスにフォーカスを設定する。
但し、検証は(サーバではなく)クライアントにて行う。

<ご質問>
どのようにすれば、上記要件を実現できますでしょうか。

<現状>
検証コントロールRegularExpressionValidatorで文字種チェックを実装。
この時、SetFocusOnErrorにTRUEを設定すると、ボタン押下時ではなく、検証対象のテキストボックスのLostFocus時にチェックが走ってしまう。
 ↓
検証コントロールRegularExpressionValidatorでの文字種チェックは実装したまま、SetFocusOnErrorにFALSEを設定。
ボタンのOnClientClickプロパティを用い、クライアントでSetFocusのロジックのみ実装。
この場合は、検証コントロールのクライアントでのチェックが走らず、よってSetFocusのロジックも通り過ぎ、サーバでのチェックとなってしまう。
 ↓
検証コントロールを使用する以上、上記要件は実現不可!?
 ↓
そんなわけないような気がする・・・。


以上、宜しくお願い申し上げます。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2006-11-16 06:28
引用:

<現状>
検証コントロールRegularExpressionValidatorで文字種チェックを実装。
この時、SetFocusOnErrorにTRUEを設定すると、ボタン押下時ではなく、検証対象のテキストボックスのLostFocus時にチェックが走ってしまう。


LostFocus時にエラーがチェックされるのは検証コントロールの仕様なのでは?

個人的には現状の仕様の方が、エンドユーザーにとって使い勝手がよいように思いますが。

コントロールのフォーカス喪失時にエラーを検出してメッセージを表示する。そして、ボタンをクリックしたときにValidationSummaryでエラーのサマリーを表示する。

このときエラーが発生したコントロールにフォーカスを移動する。

私はこんな仕様で検証コントロールを組み込んでいます。

_________________
ASP.NET+Ajaxサンプル集

[ メッセージ編集済み 編集者: Access 編集日時 2006-11-16 07:51 ]
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-11-16 10:35
試してないけど、明示的にValidationGroupを設定するとどう動くだろ?

#あとで時間ができれば試すけど。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-11-16 20:51
Validator の focusOnError が "t" に設定されていると、
エラーを検知後該当コントロールをフォーカスしてくれるので、
こんな風にしてみた。
コード:
Button1.OnClientClick = RegularExpressionValidator1.ClientID & ".focusOnError='t'"


画面の Validator をまわしてあげればページでできるかな。
_________________
かるあ のメモスニペット
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-11-16 21:12
こんなんかな?
コード:

Dim focusOnErrorScript As New System.Text.StringBuilder
For Each ctl As Control In Page.Form.Controls
If TypeOf ctl Is IValidator Then
focusOnErrorScript.Append(ctl.ClientID & ".focusOnError='t';")
End If
Next
If focusOnErrorScript.Length <> 0 Then
Button1.OnClientClick = focusOnErrorScript.ToString()
End If


うーん、やめといたほうがいいか?
_________________
かるあ のメモ
http://karua.at.webry.info/

[ メッセージ編集済み 編集者: かるあ 編集日時 2006-11-16 22:53 ]
のすけ
常連さん
会議室デビュー日: 2006/11/14
投稿数: 28
投稿日時: 2006-11-22 11:07
かるあさん、ご回答ありがとうございます。
入力チェックを後回しとして、ビジネスロジックの実装を行っておりましたので、確認ならびにお礼が遅くなりましたこと、お詫び申し上げます。

さて、返信頂いた内容ですが、どうもうまくいきません。
何か、前提が違うのでしょうか。

こちらの実装は、以下の通りです。(関連すると思われる部分を抽出してみます。)

<テキストボックス>
CausesValidator = False

<検証コントロール>
SetFocusOnError = False
ValidationGroup = valGrp

<ボタン>
CausesValidator = True
ValidationGroup = valGrp

以上、ご回答頂けると幸いです。
また、
>うーん、やめといたほうがいいか?
とおっしゃっているのはなぜでしょうか?

宜しくお願い致します。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-11-22 11:12
引用:

のすけさんの書き込み (2006-11-22 11:07) より:

さて、返信頂いた内容ですが、どうもうまくいきません。
何か、前提が違うのでしょうか。


ごめんなさい、今環境が無いのでアドバイスだけ
最小の環境(テキストボックスとボタンとバリデーターだけ)で試してみてはどうでしょうか

引用:

>うーん、やめといたほうがいいか?
とおっしゃっているのはなぜでしょうか?


ASP.NET 側で明示的にそういう機能を提供していないから、
将来的に使えなくなるかも知れないしどこかに副作用があるかも。
_________________
かるあ のメモスニペット
のすけ
常連さん
会議室デビュー日: 2006/11/14
投稿数: 28
投稿日時: 2006-11-22 11:23
かるあさん、素早いご回答ありがとうございます!

「最小の環境」で実験した結果です。。。
もう少し、いろいろいじってみたいと思います。

あと、「副作用の可能性」の件、認識しました。
しかしながら、他に手段がないのなら。。。
要件からもう一度考えて(お伺いを立てて)みます。

今後とも宜しくお願い致します。

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