- PR -

Enterキーが押されたテキストボックスによってサーバ側の処理を切り替える

1
投稿者投稿内容
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2004-09-16 16:39
初めて投稿させて頂きます。VB.NETでWebアプリケーションを開発しています。
質問の件は、どうしても必要、というわけではなく、できたら便利だな、というレベルなのですが、過去の記事を見ても同じ内容が見つからなかったので(実はあって、見つけられてないだけだったらごめんなさい)新規にスレッドを立てさせて頂きます。

やりたいことの簡単な例を挙げると、ある1つの画面上に、テキストボックスが10個、送信ボタン1個を1つのグループとして、これが3組あったとします。で、押されたボタンによって、サーバ側の処理の種類が変わって、それぞれのグループに対応した処理を行うと。

これ、マウスでボタンを押したときのことだけ考えれば簡単なのですが、テキストボックス内でEnterを押しても同じようにしたいとすると、これが難しい。HTMLの基本から考えれば、formタグを複数作ればいいんですが、ASP.NETは1つのページに1つのformタグしか許してくれないからです。

サーバコントロールのhiddenフォームにテキストボックスのfocusイベントに合わせてフラグを埋め込んで、サーバ側のPage_Loadでそのフラグを見て切り替えるようにすれば、同じような動きをさせることはできるのですが、どうもスマートじゃないような気がして、そこまでして実装する必要は無いかな、と思ってます。

もし、もっとスマートな方法をご存知の方いらっしゃいましたら、ご教授頂けないでしょうか。
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2004-09-16 17:47
引用:

ぼのぼのさんの書き込み (2004-09-16 16:39) より:

これ、マウスでボタンを押したときのことだけ考えれば簡単なのですが、テキストボックス内でEnterを押しても同じようにしたいとすると、これが難しい。HTMLの基本から考えれば、formタグを複数作ればいいんですが、ASP.NETは1つのページに1つのformタグしか許してくれないからです。


runat="server"となっているformタグは1つしか書けませんが、formタグ自体はいくつでも書けますよね。
ただ、formタグの中にはサーバコントロールは置けないので、HTMLコントロールしか使えなくなってしまいます。
ASPのようなコーディングをすればとりあえずは動くものが作れるような気がしますが。。。
それでいいかどうかは、ねぇ。
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2004-09-16 18:26
遊んでたら、こんなんになりました。
スマートかどうかは、判断できませんが、
DIVでグループ化してます。

[aspx 抜粋]
・JavaScript部分
 <script language="javascript">
  function doTest(type) {
   if(event.keyCode == 13) {
    document.Form1[type].focus();
   }
}
</script>

・Form部分
<form id="Form1" method="post" runat="server">
<!-- テキストグループ1 -->
<DIV style="Z-INDEX: 101; LEFT: 66px; WIDTH: 262px; POSITION: absolute; TOP: 61px; HEIGHT: 59px" ms_positioning="FlowLayout" onkeydown="doTest('Button1')">
<asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
<asp:Button id="Button1" runat="server" Text="Button"></asp:Button>
<asp:TextBox id="TextBox3" runat="server"></asp:TextBox>
</DIV>
<!-- テキストグループ2 -->
<DIV style="Z-INDEX: 102; LEFT: 69px; WIDTH: 263px; POSITION: absolute; TOP: 141px; HEIGHT: 62px" ms_positioning="FlowLayout" onkeydown="doTest('Button2')">
<asp:TextBox id="Textbox2" runat="server"></asp:TextBox>
<asp:Button id="Button2" runat="server" Text="Button"></asp:Button>
<asp:TextBox id="TextBox4" runat="server"></asp:TextBox>
</DIV>
<asp:Label id="Label1" style="Z-INDEX: 104; LEFT: 76px; POSITION: absolute; TOP: 228px" runat="server" Width="429px">結果表示</asp:Label>
</form>

[CS 抜粋]
private void Button1_Click(object sender, System.EventArgs e)
{
Label1.Text = "ボタン1がクリックされました。";
}

private void Button2_Click(object sender, System.EventArgs e)
{
Label1.Text = "ボタン2がクリックされました。";
}
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2004-09-17 11:48
小野@どっとねっとふぁんさん wrote:
> runat="server"となっているformタグは1つしか書けませんが、
> formタグ自体はいくつでも書けますよね。
これ、知らなかったです。勉強になりますm(_ _)m
> ただ、formタグの中にはサーバコントロールは置けないので、
> HTMLコントロールしか使えなくなってしまいます。
でもこれだとあんま意味ないですね(^^; 個人のページならともかく、会社のプロジェクトであんまり変なことやると他の人がメンテできなくなってしまうので(笑)。

nanbuさん wrote:
> 遊んでたら、こんなんになりました。
> スマートかどうかは、判断できませんが、
> DIVでグループ化してます。
おお!できたぁ!すげぇ!
今のプロジェクトではクライアントスクリプトになるべくvbscriptを使うことになってるので、VB.NETとvbscriptで書きなおしてみました。

[aspx 抜粋]
・vbscript部分
<script language="vbscript">
sub Panel1_onkeydown
 if window.event.keycode = 13 then
  document.all("Button1").focus()
 end if
end sub
sub Panel2_onkeydown
 if window.event.keycode = 13 then
  document.all("Button2").focus()
 end if
end sub
</script>

・Form部分
<form id="Form1" method="post" runat="server">
 <DIV id="Panel1" style="Z-INDEX: 104; LEFT: 40px; WIDTH: 316px; POSITION: absolute; TOP: 52px; HEIGHT: 88px" ms_positioning="GridLayout">
 <asp:TextBox id="TextBox1" style="Z-INDEX: 112; LEFT: 24px; POSITION: absolute; TOP: 20px" runat="server"></asp:TextBox>
 <asp:TextBox id="TextBox2" style="Z-INDEX: 112; LEFT: 24px; POSITION: absolute; TOP: 52px" runat="server"></asp:TextBox>
 <asp:Button id="Button1" style="Z-INDEX: 112; LEFT: 212px; POSITION: absolute; TOP: 36px" runat="server" Text="送信1"></asp:Button>
</DIV>
<DIV id="Panel2" style="Z-INDEX: 105; LEFT: 40px; WIDTH: 316px; POSITION: absolute; TOP: 152px; HEIGHT: 100px" ms_positioning="GridLayout">
 <asp:TextBox id="TextBox4" style="Z-INDEX: 112; LEFT: 24px; POSITION: absolute; TOP: 52px" runat="server"></asp:TextBox>
 <asp:Button id="Button2" style="Z-INDEX: 112; LEFT: 212px; POSITION: absolute; TOP: 36px" runat="server" Text="送信2"></asp:Button>
 <asp:TextBox id="TextBox3" style="Z-INDEX: 112; LEFT: 24px; POSITION: absolute; TOP: 20px" runat="server"></asp:TextBox>
</DIV>
<asp:Label id="Label1" style="Z-INDEX: 103; LEFT: 40px; POSITION: absolute; TOP: 268px" runat="server"></asp:Label>
</form>

[VB.NET 抜粋]
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 Me.Label1.Text = "ボタン1がクリックされました。"
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
 Me.Label1.Text = "ボタン2がクリックされました。"
End Sub

うーん、こんな方法があったんですね。ありがとうございました。

以下は完全に余談ですが、vbscriptとjavascript、利用者は後者の方が圧倒的に多いし、後者の方が優れている点の方が多いのも確かだと思うのですけど、実際前者を使ってみると、関数名を"id_イベント名"にしてやると勝手に関連付けられて、タグの方に何も書かなくていいのと、カンマ埋めとかフォーマット系の道具が充実してるのとで、けっこう重宝してます。IE以外のブラウザでちゃんと動くかはわかんないですけど…
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2004-09-17 12:28
引用:

ぼのぼのさんの書き込み (2004-09-17 11:48) より:

以下は完全に余談ですが、vbscriptとjavascript、利用者は後者の方が圧倒的に多いし、後者の方が優れている点の方が多いのも確かだと思うのですけど、実際前者を使ってみると、関数名を"id_イベント名"にしてやると勝手に関連付けられて、タグの方に何も書かなくていいのと、カンマ埋めとかフォーマット系の道具が充実してるのとで、けっこう重宝してます。IE以外のブラウザでちゃんと動くかはわかんないですけど…



VBScriptだと"id_イベント名"で関連付けられるんですね。
これは確かに便利そうですね。
(ああ、でも行末に「;」がないと違和感が、、、、)

ところで、自分で作っておきながら、
focus()でサブミットされるは何でだろう?
click()だとうまくいかないのは何でだろう?

、、、、、

ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2004-09-17 15:13
引用:

ところで、自分で作っておきながら、
focus()でサブミットされるは何でだろう?
click()だとうまくいかないのは何でだろう?


あくまで憶測ですが、暗黙的処理順優先順位みたいのがあるんですかねぇ?
ボタンのclick()による送信処理よりも、Enterキーが押されたことによる送信処理の方が先に実行される、でもfocus()はそれより前に実行される、みたいな…
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2004-09-26 19:18
なるほど!
ふしぎサブミットですね。(やっぱりよくわかっていない)

[ メッセージ編集済み 編集者: nanbu 編集日時 2004-09-26 21:25 ]
1

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