アプリ版:「スタンプのみでお礼する」機能のリリースについて

ASP.NET(VB)で開発しています。
Page_init時に生成されるテキストボックス1、2(動的コントロール)を表示します。
テキストボックス1のテキストチェンジイベント時に
テキストボックス2にフォーカスが移動するようにしたいです。

テキストチェンジでPostBackが発生し、サーバ側でテキストボックス2.Focus()
と記述しているのですが、動作は、テキストボックス2に
フォーカスが移らず、画面上のどこにもフォーカスがあたっていない状態になってしまいます。

動的コントロールへ、PostBack時にフォーカス移動させるにはどうしたら良いか
お願いいたします。

A 回答 (2件)

以下のようにすれば可能と思いますが、これと違うことがしたいのなら、どのようにしたいのかもっと詳しく書いてください。



<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …

<script runat="server">

protected void Page_Init(object sender, EventArgs e)
{
TextBox tb = new TextBox();
tb.ID = "TextBox1";
tb.Text = "TextBox1";
tb.AutoPostBack = true;
tb.TextChanged += new EventHandler(TextBox1_TextChanged);
PlaceHolder1.Controls.Add(tb);

tb = new TextBox();
tb.ID = "TextBox2";
tb.Text = "TextBox2";
tb.AutoPostBack = true;
tb.TextChanged += new EventHandler(TextBox2_TextChanged);
PlaceHolder1.Controls.Add(tb);
}

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
TextBox tb = (TextBox)PlaceHolder1.FindControl("TextBox1");
if (tb != null)
{
tb.Focus();
}
}
}

protected void TextBox1_TextChanged(object sender, EventArgs e)
{
TextBox tb = (TextBox)PlaceHolder1.FindControl("TextBox2");
if (tb != null)
{
tb.Focus();
}
}

protected void TextBox2_TextChanged(object sender, EventArgs e)
{
TextBox tb = (TextBox)PlaceHolder1.FindControl("TextBox1");
if (tb != null)
{
tb.Focus();
}
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
</div>
</form>
</body>
</html>
    • good
    • 0

んー、ちょっと難しい問題ですね。



「フォーカスの移動」てのは、基本的にクライアントサイドの動き。
javascript的に言うと、"document.getElementById("hoge").focus()"なわけで、サーバサイドから指示するっていうのは、onloadで動作する、そういうjsをレスポンスに書き込んでいる処理だから、サーバサイドの生成コントロール(つうかhtml要素)を、うまくjsスタートアップが捕捉できてないんだと思います。

「フォーカス」という行為に限って言うなら、サーバサイド処理の「動的(つうか行き当たりばったりな)」処理をやめて、宣言的にするのが一番かと。
1.Page_Initイベントでの動的生成を止める。宣言的に配置しておいて、visibleなどで制御する。
2.TextChangedイベントを止め、クライアントサイドで捕捉する。
3.全部クライアントサイドにしてしまう。

他の処理との兼ね合いでサーバサイド(PostBack)処理が必要なら仕方ないですが、UI的なAjaxぽい意味、jQueryとかでやったほうが何倍もスムーズですよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!