使用ASP.NET AJAX控件工具包设置焦点

使用ASP.NET AJAX控件工具包设置焦点,asp.net,Asp.net,我正在使用ASP.NET AJAX控件工具包中的控件,并且遇到了一个问题,即当我将焦点设置到指定的文本框时,自动完成没有填充 我尝试在Page_Load、Page_PreRender和Page_Init事件中设置焦点,焦点设置正确,但自动完成不起作用。如果我不设置焦点,一切正常,但我想设置它,这样用户就不会有额外的点击 有没有一个特别的地方我需要设置焦点或其他我需要做的事情,使这项工作?谢谢。我们遇到了完全相同的问题。我们要做的是在页面底部写一个脚本,它会很快变得模糊,然后重新聚焦到文本框。您可

我正在使用ASP.NET AJAX控件工具包中的控件,并且遇到了一个问题,即当我将焦点设置到指定的文本框时,自动完成没有填充

我尝试在Page_Load、Page_PreRender和Page_Init事件中设置焦点,焦点设置正确,但自动完成不起作用。如果我不设置焦点,一切正常,但我想设置它,这样用户就不会有额外的点击


有没有一个特别的地方我需要设置焦点或其他我需要做的事情,使这项工作?谢谢。

我们遇到了完全相同的问题。我们要做的是在页面底部写一个脚本,它会很快变得模糊,然后重新聚焦到文本框。您可以在此处查看(非常粗糙的)解决方案:

文本框id为
MainSearchBox\u SearchTextBox
。看看第586行&你可以看到我在哪里连接所有事件(我实际上在使用原型)

基本上,在文本框的焦点事件中,我将一个名为
textBoxHasFocus
的全局变量设置为true,在模糊事件中,我将其设置为false

if (textBoxHasFocus) {
    $get("MainSearchBox_SearchTextBox").blur();
    $get("MainSearchBox_SearchTextBox").focus();
}  

这会重置文本框。这确实很棘手,但这是我能找到的唯一解决方案。您如何设置焦点?我没有尝试过您建议的特定场景,但以下是我如何设置控件焦点的方法:

Public Sub SetFocus(ByVal ctrl As Control)
    Dim sb As New System.Text.StringBuilder
    Dim p As Control
    p = ctrl.Parent
    While (Not (p.GetType() Is GetType(System.Web.UI.HtmlControls.HtmlForm)))
        p = p.Parent
    End While
    With sb
        .Append("<script language='JavaScript'>")
        .Append("function SetFocus()")
        .Append("{")
        .Append("document.")
        .Append(p.ClientID)
        .Append("['")
        .Append(ctrl.UniqueID)
        .Append("'].focus();")
        .Append("}")
        .Append("window.onload = SetFocus;")
        .Append("")
        .Append("</script")
        .Append(">")
    End With
    ctrl.Page.RegisterClientScriptBlock("SetFocus", sb.ToString())
End Sub
Public子集合焦点(ByVal ctrl作为控件)
将sb设置为新System.Text.StringBuilder
dimpas控件
p=ctrl.Parent
而(不是(p.GetType()是GetType(System.Web.UI.HtmlControls.HtmlForm)))
p=p.父母
结束时
与某人
.附加(“”)
.Append(“函数SetFocus()”)
.Append(“{”)
.Append(“文件”)
.Append(p.ClientID)
.Append(“[”)
.Append(ctrl.UniqueID)
.Append(“'].focus();”)
.Append(“}”)
.Append(“window.onload=SetFocus;”)
.附加(“”)
.附加(“”)
以
ctrl.Page.RegisterClientScriptBlock(“SetFocus”,sb.ToString())
端接头

因此,我不确定您使用的是什么方法,但如果它与我的方法不同,请尝试一下,看看您是否仍然有问题。

我通常会注册客户端脚本,从我的codebehind方法运行下面的setFocusTimeout方法。运行时,它会等待一小段时间,然后调用相应的方法逻辑设置焦点(setFocus)。这是非常粗糙的,但似乎您必须走这样的路线来阻止AJAX窃取您的焦点

function setFocusTimeout(controlID) {
    focusControlID = controlID;
    setTimeout("setFocus(focusControlID)", 100);
}

function setFocus() {
    document.getElementById(focusControlID).focus();
}

我从Glenn Slaven和Kris/Alex那里找到了答案,使我更接近于解决我在ASP.NET TextBox控件上设置焦点时遇到的特殊问题,该控件附带了AutoCompleteXtender不断抛出一个javascript错误,暗示document.getElementById返回空对象。FocusControl变量为TextBox控件返回正确的运行时ClientID值。但出于任何原因,document.getElementById函数不喜欢它

我的解决方案是将jQuery加入到混合中,因为我已经在使用它来绘制任何具有焦点的控件的背景,并强制Enter键在表单中使用tab键,而不是触发回发

我的setFocus函数最终如下所示:

function setFocus(focusControlID) {
    $('#' + focusControlID).blur();
    $('#' + focusControlID).focus();
}
这消除了javascript运行时错误,将焦点放在所需的TextBox控件上,并将光标也放在控件内。如果不先模糊然后聚焦,控件将高亮显示,就像它有焦点一样,但光标还不会位于控件中。用户仍需在控件内单击以将其选中杜松子酒编辑,这将是一个用户体验烦恼

我还不得不将超时时间从100增加到300。你的里程数我的不同

我同意大家的看法,这是一种黑客行为。但从最终用户的角度来看,他们看不到这段代码。他们的黑客行为是,如果他们必须手动单击控件内部,而不是仅仅自动放置在控件内部并键入前几个字母以触发自动查找功能。因此,向所有o提供了他们的黑客


我希望这对其他人有帮助。

这是浪费,很简单

这就是你需要做的

controlId.focus();在C中# VB中的controlID.focus()

将其放入页面加载或按钮单击部分

例如,panel1.focus();若panel1附加了模型弹出扩展程序,那个么我们将此代码放在页面加载部分