- PR -

[VB.NET]TextBoxからTABキーをクリックしないでタブ移動したい。

1
投稿者投稿内容
slan
会議室デビュー日: 2004/02/07
投稿数: 3
お住まい・勤務地: 山口県
投稿日時: 2004-02-17 15:09
こんにちは、初めて質問させていただきます。
vb.netでwebアプリケーションを開発しています。

過去ログを検索しましたが、情報を見つけることが出来ませんでしたので質問させてください。

次のような処理を考えています。
Webフォームには、1つのwebコントロールTextBoxと1つのwebコントロールButtonが配置されています。
Buttonをクリックした時に、条件を満たしていたら確認メッセージを出す設定を行い、満たさない場合は設定しないようにしようとしています。

現状は以下のとおりです。

TextBoxに入力が行われ、TabキーをクリックしないでButtonをクリックした時に、TextChangedで止まってしまいButtonのClickイベントの中身が処理されません。

処理されない理由としては、ポストバック時に入力値によってDBのレコードを調査し、その有無によってButtonのOnclick属性を書き換えるように記述しているためのようです。実際のコーディングは以下のようにしています。

[Page_Load]
intChk → DB検索して条件を満たしたレコードの件数

txtitem = Button.Attributes.Item("onclick")
If intChk >= 1 Then
'パラメータ(抽出期間)が先月だったら確認メッセージを表示する
'調査結果がある場合はポストバック時にOnclickにJavaScriptのキックを追加
If () Then
Button.Attributes.Add("onclick", "return Confirm(処理を実行しますか。);")
Else
If Not IsNothing(txtitem) Then
Button.Attributes.Remove("onclick")
End If
End If
Else
If Not IsNothing(txtitem) Then
Button.Attributes.Remove("onclick")
End If
End If

[TextBox_TextChanged]
TextBoxの入力値を取得し変数にセットしている

TextBoxにはAutoPostBack=Trueを設定し、TextBoxが変更されたらポストバックします。

以下の操作でデバッグを行った結果

1.画面オープン →Page_Load
2.TextBoxに入力
3.Buttonクリック →Page_Load → TextBox_Changed (→Button_Clickが発生して欲しい。)

という流れでイベントが発生しButton_Clickに記述されている内容が実行されません。

入力後、フォーカスを他に移動させた後(TABキークリック)ボタンをクリックするとこれが本来の正しい操作なのでbutton_clickイベントが実行されることから、TextboxのText_Changedで変更された入力値を取得した後、フォーカスをTextbox以外の場所へ移動できればと考えています。(Buttonに移動するのが最良のように思われます。)

ここまでの処理は、こちらの過去のスレッド
「TextChangedとClickイベントの同時発生について」
http://(http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9322&forum=7)
を参考にさせていただいきました。

WindowsアプリケーションならSetfocus()を使えば簡単に出来ると思うのですが、Webアプリケーションではクライアント処理とサーバ処理の切り分けなども関係して簡単にはいかないのだろうかと考えています。
Webアプリケーションの開発は初めてでまだ経験が浅いので簡単な質問かもしれませんが、どうぞご教授ください。

長文で失礼しました。

[ メッセージ編集済み 編集者: slan 編集日時 2004-02-17 15:11 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-17 16:05
 テキストボックスに入力があるごとに、
・ポストバックが発生して、
・データベースに問い合わせて、
データがあればconfirmを、なければsubmitさせない、ということでしょうか?
なんだかクリックイベントを削除しているのが気になるのですが。。。HTMLのソースは確認しましたか?


#####
 はたしてそんな処理をする必要があるのだろうか?

 速いイントラネットで、少数の人のみの使用であれば、問題はほとんどないのかもしれないが、トラフィックやデータベースアクセスに悪そう。

 Webアプリケーションに即時性を求めるのが間違いだと思うのだが、ASP.NETがそういうことをできるような作りにしてしまっているのだから仕方がないのかなぁ?
slan
会議室デビュー日: 2004/02/07
投稿数: 3
お住まい・勤務地: 山口県
投稿日時: 2004-02-17 17:35
Jittaさん、回答ありがとうございます。

引用:

 テキストボックスに入力があるごとに、
・ポストバックが発生して、
・データベースに問い合わせて、
データがあればconfirmを、なければsubmitさせない、ということでしょうか?
なんだかクリックイベントを削除しているのが気になるのですが。。。HTMLのソースは確認しましたか?

#####
 はたしてそんな処理をする必要があるのだろうか?



ピンとのずれた回答になっていたらすみません。

このボタンはストアドプロシージャのキックとして設定しているもので、当初は確認メッセージを出す要件がありませんでした。
しかし、開発している途中で確認メッセージを表示する必要が出てきました。

実現させたいのは単純に以下の内容です。

・DBに対象レコードがあれば確認メッセージを出し、そうじゃない時は出さない。
・Confirmで[OK]が選択された時だけその後の処理を実行(Button_Click)し、[キャンセル]が選択されたら中断する。

webアプリケーションでは、WindowsアプリケーションのようにMessageボックスをぽんっとだすというような事が出来ないことが分かり、それと似たようなことを実現するためにはJavaScriptの記述が必要だと知りました。
いろいろやっているうちにJavaScriptでは確認メッセージの表示だけさせればいいなと考えました。
そこでこのようなコーディングをすることにしました。

先にonclick属性で確認メッセージを出せることを知ったので、単純にこの属性を書いたり消したりすればメッセージを出したり出さなかったり出来るなと考えたのです。
submitは使い方がよく分かりませんでしたので記述していません。

最初は、Confirmの戻り値をサーバで受け取ってその後の処理を決めればいいのではないかと考えていたのですが、戻り値を戻す方法がよく分からなかったんです。
それで、テストしているうちにConfirmは[OK]が押された時だけ戻り値があることが分かったので単純に[キャンセル]が選択された時に中断出来ればいいと判断しました。


引用:

 速いイントラネットで、少数の人のみの使用であれば、問題はほとんどないのかもしれないが、トラフィックやデータベースアクセスに悪そう。



確かに、Jittaさんの言われるようにトラフィックやデータベースアクセスで問題はおきそうですよね。
その点は正直なところ考慮していませんでした。
ただし、このプログラムは権限を与えられた数人(多分2人位)の方しか使用しない予定です。
処理も月次処理なのであまり問題はないかなと思っています。(思っていいのだろうか・・・汗っ)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-17 17:55
 すみません、条件を書き分けていただけますか?例えばこんな風。

ボタンクリック:
 if 入力 <= 今月 then
  if 確認 = OK then
   データベースへ問い合わせ
  endif
 endif

これだけでいいような?


えっと・・・コレをクライアントでやるとしたら、
<input type="hidden" runat="server" id="iptThisMonth">
を用意して、Page_Loadでここに今月を入れます。
iptThisMonth.Value = date.today.month

クライアントにチェック用の関数を用意します。
<スクリプト>
function monthCheck(target, checker) {
 if (checker.value > target.value) { // textかな?
  // 入力が今月より小さい
  return confirm('処理を実行しますか。'); // 「いいえ」はfalseが返る
 } else {
  // 入力が今月以上の時は捨てる
  alart('入力は先月以前でなければなりません。');
  return false; // falseを返せば、submitしない
 }
}
</スクリプト>

Page_Loadあたりで、この関数を呼ぶように、ボタンのクリックイベントを細工します。return文で、関数の戻り値を上位に返します。すると、上位でtrue/falseを見て、trueであればsubmit(ポストバック)します。return文がないと、返値は捨てられます。
button.attribute.add("onclick" _
, string.format("javascript:return monthCheck({0}, {1});" _
, 入力テキストボックス.clientid, iptThisMonth.clientid)


ここで適当に打っているので、チェックし、フィードバックしてください。

<<<<<
やっぱり間違ってるわ。
IEのみになってしまいますが、
>  if (checker.value > target.value) {
>> if (document.all[checker].value > document.all[target].value) {
かな。この辺自信ないので、きちんとチェックしてください。

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-02-17 17:58 ]
slan
会議室デビュー日: 2004/02/07
投稿数: 3
お住まい・勤務地: 山口県
投稿日時: 2004-02-18 09:08
Jittaさん、返事が遅くなって申し訳ありません。
詳しい回答をありがとうございます。

引用:

Jittaさんの書き込み (2004-02-17 17:55) より:
 すみません、条件を書き分けていただけますか?例えばこんな風。

ボタンクリック:
 if 入力 <= 今月 then
  if 確認 = OK then
   データベースへ問い合わせ
  endif
 endif

これだけでいいような?




条件を書き分けるとこうです。

ボタンクリック:
if 入力 = 先月 then
  データベースへ問い合わせ
  if 問い合わせ結果 >= 1 then
    if 確認 = OK then
      プロシージャ実行
else
  プログラム中断
    end if
  end if
end if

現在のJavaScriptの記述は以下のとおりです。

----------------------------------------------------------------------
<script language="javascript">
<!--
// 確認メッセージ
function func_Confirm(){
flag = confirm("先月入力分が未確定のデータが存在します。処理を実行しますか。");
if (flag==false) alert('転送処理を中断しました。');
return flag;
}
//-->
</script>
----------------------------------------------------------------------

入力値のチェックはJittaさんの書かれているようにJavaScriptで行うことも考えましたが、データベースへの問い合わせもJavaScriptで行っても問題ないならクライアントで判断するほうがいいのではないかとは思います。
でも、データベースへの問い合わせをJavaScriptで記述するのってやっていいことなのかまた出来ることなのかが分かりません。

入力値をチェックしたあとに問い合わせを行うのならJittaさんの方法でもいいのかもしれません。

「ボタンのクリックイベントを細工」とは具体的にどのように設定するのでしょうか。
ポストバックを強制的に実行する方法がよく分からず今の方法を取ったので、ぜひご教授いただきたいです。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-18 09:48
> 返事が遅くなって申し訳ありません。
 メールとかWebとかは、基本的に「相手の都合の良い時間に見てもらう」モノなので(最近のブロードバンドで即時性が良くなりましたが)、時間がかかることは気にすることはありません。が、即時性を求めてはいけません。

引用:

ボタンクリック:
if 入力 = 先月 then
  データベースへ問い合わせ
  if 問い合わせ結果 >= 1 then
    if 確認 = OK then
      プロシージャ実行
    else
      プログラム中断
    end if
  end if
end if


 この中で、「サーバでないとできないこと」、「クライアントでしたいこと」を、切り分けてみましょう。
※入力チェック
 コレはサーバでもクライアントでもできます
※データベースへの問い合わせ
 JavaScriptではできないと思います。
 ActiveXやJavaアプレットと連携すれば可能。
 VBScriptを使えば、ADOオブジェクトを作って問い合わせることが可能?
 つまり、「サーバの処理」
※確認
 ユーザに対するものなので、「クライアントの処理」
※プロシージャ実行
 問い合わせと同じく、「サーバの処理」

 “私の”技術ではこのようになります。したがって、やろうとしていることは

ボタンクリック:
if 「サーバかクライアントの処理」 then
  「サーバの処理」
  if 問い合わせ結果 >= 1 then
    if 「クライアントの処理」 then
      「サーバの処理」
    else
      プログラム中断
    end if
  end if
end if

と、サーバでしたいこと、クライアントでしたいことが入れ子になります。もしこの手順で行うなら、私が今知っていることで実現するには、ページを2枚用意して、「問い合わせ」が必要な時は2枚目へ飛び、2枚目のサーバサイドプログラムでプロシージャを実行します。

 または、「入力が先月の時のみ」であるなら、ページをロードするときに「先月」はわかっているので(ページを表示して数日放って置かれた場合を除く)、Page_Loadであらかじめ「問い合わせ結果」の確認をしておく…しかし、そうすると入力も不要になる?


引用:

「ボタンのクリックイベントを細工」とは具体的にどのように設定するのでしょうか。
ポストバックを強制的に実行する方法がよく分からず今の方法を取ったので、ぜひご教授いただきたいです。


 ポストバックは、HTML(JavaScript?)の用語ではsubmitです。ボタンは<input type=submit>に置き換わりますから、onclickイベントでtrueを返せば、submitされます。
1

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