使用ASP.NET AJAX Control Toolkit设置焦点

时间:2008-09-03 23:29:44

标签: asp.net

我正在使用ASP.NET AJAX控件工具包中的AutoComplete控件,而我遇到的问题是,当我将焦点设置为指定的文本框时,不会填充自动完成功能。

我已尝试在Page_Load,Page_PreRender和Page_Init事件中设置焦点,并且焦点设置正确但AutoComplete不起作用。如果我没有设置焦点,一切正常,但我想设置它,以便用户没有额外的点击。

我需要设置一个特殊的地方来设置焦点或其他我需要做的事情来使这项工作吗?感谢。

5 个答案:

答案 0 :(得分:3)

我们遇到了完全相同的问题。我们要做的是在页面底部写一个脚本,然后快速模糊然后重新聚焦到文本框。你可以在这里查看(非常hacky)解决方案:http://www.drive.com.au

文本框ID为MainSearchBox_SearchTextBox。看看第586行&你可以看到我在哪里连接所有事件(我实际上正在使用原型。

基本上在文本框的焦点事件中,我将名为textBoxHasFocus的全局变量设置为true,而在模糊事件中,我将其设置为false。在页面的load事件中我称之为脚本:

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

这会重置文本框。这真的很狡猾,但这是我能找到的唯一解决方案

答案 1 :(得分:1)

这是浪费,简单

这是你需要做的事情

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

将其放在页面加载或button_click部分

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

答案 2 :(得分:0)

你是如何设定焦点的?我没有尝试过您建议的具体方案,但这里是我如何将焦点设置为我的控件:

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

所以,我不确定你使用的是什么方法,但是如果它与我的不同,那就试一试,看看你是否还有问题。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

我找到了Glenn Slaven和Kris / Alex的答案,让我更接近解决我的特定问题,将焦点放在附加了AutoCompleteExtender的ASP.NET TextBox控件上。 document.getElementById(focusControlID).focus()不断抛出一个javascript错误,暗示document.getElementById返回一个null对象。 focusControlID变量为TextBox控件返回正确的运行时ClientID值。但无论出于何种原因,document.getElementById函数都不喜欢它。

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

我的setFocus函数最终看起来像这样:

function setFocus(focusControlID) {
    $('#' + focusControlID).blur();
    $('#' + focusControlID).focus();
}

这摆脱了javascript运行时错误,将焦点放在所需的TextBox控件上,并将光标放在控件中。在没有先模糊然后聚焦的情况下,控件将被突出显示,就好像它具有焦点一样,但是光标还不会坐在控件中。用户仍然必须在控件内部单击以开始编辑,这将是一个用户体验的烦恼。

我还必须将超时时间从100增加到300.你的里程数我的变化......

我同意所有人的看法,这是一个黑客行为。但从最终用户的角度来看,他们没有看到这段代码。对他们来说,如果他们必须手动点击控件内部而不是仅仅自动放入控件内并输入前几个字母来触发自动查找功能。所以,向所有提供黑客的人致敬。

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