ASP.Net アプリケーション (C#) で TextBox コントロール (UpdatePanel 内) にフォーカスを設定しようとしています。コードビハインドで次のことを試しました。
tbxName.Focus();
Page.SetFocus(tbxName);
tsmManageTables.SetFocus(tbxName);
それらのどれも機能しなかったので、Javascript に行きました。ここに私のJavascript関数があります:
function SetControlFocus(ctrlID) {
var ctrl = document.getElementById(ctrlID);
ctrl.focus();
}
これを呼び出しているコード ビハインドのメソッドは次のとおりです。
private void SetControlFocus(Control ctrl)
{
StringBuilder focus = new StringBuilder();
focus.AppendLine("<script type='text/javascript'>");
focus.AppendFormat(" SetControlFocus('{0}');" + System.Environment.NewLine, ctrl.ClientID);
focus.AppendLine("</script>");
ClientScript.RegisterStartupScript(this.GetType(), "setControlFocus", focus.ToString(), false);
}
そして呼び出し:
SetControlFocus(tbxName);
Javascriptも試しました:
(function($) {
SetControlFocus = function(ctrlID) {
var ctrl = $('<%= ' + ctrlID + ' %>');
ctrl.focus();
};
})(jQuery);
どちらのバージョンの Javascript 関数でも、エラーが発生します
「オブジェクト ctl00_MainContent_tbxName にはメソッド 'focus' がありません」
私は何を間違っていますか?
更新:
醜い でIDセレクターの代わりにクラスセレクターを使用するというKarlの提案を試みました<%= =>
が、うまくいきませんでした。今、私は別のエラーが発生しています:
Uncaught ReferenceError: className が定義されていません
Javascriptで:
(function($) {
SetControlFocus = function(ctrlClass) {
var ctrl = $('.' + ctrlClass);
ctrl.focus();
};
})(jQuery);
マークアップ:
<asp:TextBox ID="tbxName" runat="server" CssClass="className"></asp:TextBox>
呼び出し方法:
private void SetControlFocus(Control ctrl)
{
StringBuilder focus = new StringBuilder();
focus.AppendLine("<script type='text/javascript'>");
focus.AppendFormat(" SetControlFocus({0});" + System.Environment.NewLine, ctrl.CssClass);
focus.AppendLine("</script>");
ClientScript.RegisterStartupScript(this.GetType(), "setControlFocus", focus.ToString(), false);
}
呼び出し (C#):
SetControlFocus(tbxName);
TextBox 用に生成された HTML:
<input name="ctl00$MainContent$tbxName" type="text" id="ctl00_MainContent_tbxName" class="className" />
更新 2 :
私はこれでもう少し遊んで、進歩しました(私は思います)。エラー メッセージは表示されなくなりましたが、まだフォーカスが TextBox に移動していません。これが私の現在のjQuery関数です:
(function($) {
SetControlFocus = function(ctrl) {
//give the control focus
alert(ctrl);
ctrl.focus();
};
})(jQuery);
そして、これが私が呼び出す C# メソッドです。
private void SetControlFocus(TextBox ctrl)
{
StringBuilder focus = new StringBuilder();
focus.AppendLine("<script type='text/javascript'>");
focus.AppendFormat(" SetControlFocus({0});" + System.Environment.NewLine, ctrl.ClientID);
focus.AppendLine("</script>");
ClientScript.RegisterStartupScript(this.GetType(), "setControlFocus", focus.ToString(), false);
} //end method SetControlFocus
コントロールの ClientID を Javascript 関数に渡していることに注意してください。奇妙なことに、Javascript は、ClientID を含む文字列ではなく、ClientID を取得し、実際にコントロール オブジェクトを「キャプチャ」します。アラートは機能しています[object HTMLInputElement]
。アラートで教えてくれます。任意のヒント?
更新 3 :
Javascript 関数を変更しました。
(function($) {
SetControlFocus = function(ctrlSelector) {
alert(ctrlSelector);
$(ctrlSelector).focus();
};
})(jQuery);
および呼び出し方法:
private void SetControlFocus(TextBox ctrl)
{
StringBuilder focus = new StringBuilder();
focus.AppendLine("<script type='text/javascript'>");
focus.AppendFormat(" SetControlFocus('{0}');" + System.Environment.NewLine, "#" + ctrl.ClientID);
focus.AppendLine("</script>");
ClientScript.RegisterStartupScript(this.GetType(), "setControlFocus", focus.ToString(), false);
}
(引数 - を一重引用符で囲んでいることに注意してください'{0}'
)。
今、私は正しいセレクターを取得しています (アラートは で応答します#ctl00_MainContent_txtName
)、エラーはありませんが、TextBoxはまだフォーカスされていません。