ASP.NETログインコントロール内にあるユーザー名TextBoxにフォーカスを設定しようとしています。
私はこれをいくつかの方法で試みましたが、どれも機能していないようです。ページは読み込まれていますが、コントロールに行きません。
これが私が試したコードです。
SetFocus(this.loginForm.FindControl("UserName"));
そして
TextBox tbox = (TextBox)this.loginForm.FindControl("UserName");
if (tbox != null)
{
tbox.Focus();
} // if
ページでScriptManagerを使用していますか?その場合は、以下を試してください。
public void SetInputFocus()
{
TextBox tbox = this.loginForm.FindControl("UserName") as TextBox;
if (tbox != null)
{
ScriptManager.GetCurrent(this.Page).SetFocus(tbox);
}
}
更新:これまでマルチビューを使用したことはありませんが、これを試してください:
protected void MultiView1_ActiveViewChanged(object sender, EventArgs e)
{
SetInputFocus();
}
私はPage.Form.DefaultFocusを使用しており、動作します:
// inside page_load, LoginUser is the Login control
Page.Form.DefaultFocus = LoginUser.FindControl("Username").ClientID;
protected void Page_Load(object sender, EventArgs e)
{
SetFocus(LoginCntl.FindControl("UserName"));
}
上記の答えのどれも私にとってうまくいかなかったので、私は単に試しました:
protected void Page_Load(object sender, EventArgs e) {
// This works for me
TxtMyTextBoxName.Focus();
}
...そしてそれはうまくいった!
ASP TextBoxを次のように定義した場合:
<asp:TextBox ID="TxtMyTextBoxName" type="search" runat="server"></asp:TextBox>
私もこれに苦労しており、深くネストされたコントロール(AspDotNetStorefront a.k.a. ASPDNSFの使用など)でも非常にうまく機能するように見えるソリューションを見つけました。 _Page_PreRender
_ルーチンから呼び出される次のコードに注意してください。フォーカスしたいTextBoxの名前を知っていたので、FocusNestedControl(Me, "UserName")
を呼び出しました。ここでMe
を使用したのは、すべてのルーチンに必要なのは、フォーカスを取得するためのコントロールの親だからです。どの親でもかまいません。
_ Public Function FocusNestedControl(ByVal ParentControl As Control, ByVal ControlNameToFocus As String) As Control
If ParentControl.HasControls Then
For Each childCtrl As Control In ParentControl.Controls
Dim goodCtrl As Control = FocusNestedControl(childCtrl, ControlNameToFocus)
If goodCtrl IsNot Nothing Then
goodCtrl.Focus()
Return goodCtrl
End If
Next
Else
If ParentControl.ID = ControlNameToFocus Then
ParentControl.Focus()
Return ParentControl
End If
End If
Return Nothing
End Function
_
次のことを試してみてください:
-2つのスクリプトを登録します(1つは、ページが表示されたときにtexboxにフォーカスする関数を作成するためのもので、2番目は、テキストボックスのIDを登録するためのものです)
this.Page.ClientScript.RegisterStartupScript(this.GetType(), "on_load",
"<script>function window_onload() \n { \n if (typeof(idLoginTextBox) == \"undefined\" || idLoginTextBox == null) \n return; \n idLoginTextBox.focus();\n } \n window.onload = window_onload; </script>");
this.Page.ClientScript.RegisterStartupScript(this.GetType(), "Focus", String.Format("<script>var idLoginTextBox=document.getElementById(\"{0}\").focus();</script>", this.loginForm.ClientID));
その結果、コードでは次のようになります。
<script>
function window_onload()
{
if (typeof(idLoginTextBox) == "undefined" || idLoginTextBox == null)
return;
idLoginTextBox.focus();
}
window.onload = window_onload;
</script>
<script>
var idLoginTextBox=document.getElementById("ctl00_LoginTextBox").focus();
</script>
LoginControlに直接フォーカスを設定すると、コントロールの最初のフィールドに自動的にフォーカスが設定されます。あなたの場合:
this.loginForm.Focus();
MSDNの詳細情報: 方法:ASP.NET Webサーバーコントロールにフォーカスを設定する
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
Login.FindControl("UserName").Focus();
}
ログインコントロールをカスタムコントロールに移動し、OnInit()メソッドでUsernameTextBoxを見つけようとすると、問題が発生しました。コントロールのOnInitは、ページのOnInitの前に実行されます。これが、フォームコントロールが作成されていない理由です。
UsernameTextBoxの呼び出しをOnLoad関数に移動しましたが、正しく機能しました。