我正在尝试将焦点设置到 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 没有方法‘焦点’”
我究竟做错了什么?
更新:
我尝试了 Karl 的建议,即使用类选择器而不是 ID 选择器和丑陋的<%= =>
,但没有奏效。现在我得到一个不同的错误:
未捕获的 ReferenceError:未定义类名
使用 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仍然没有获得焦点。