0

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はまだフォーカスされていません。

4

3 に答える 3

0

2 番目の JavaScript には、ID の選択を示すハッシュ記号がありません。

(function($) {
  SetControlFocus = function(ctrlID) {
    var ctrl = $('#<%= ' + ctrlID + ' %>');
    ctrl.focus();
  };
})(jQuery);

これでうまくいくはずです。

于 2013-11-12T22:13:42.723 に答える