5

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

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

我需要在一个特殊的地方设置焦点还是我需要做些什么来完成这项工作?谢谢。

4

5 回答 5

3

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

文本框 id 是MainSearchBox_SearchTextBox. 看一下第 586 行,你可以看到我在哪里连接所有事件(我实际上是在使用原型来处理这个位。

基本上在文本框的焦点事件上,我将一个名为 true 的全局变量设置textBoxHasFocus为 true,在 blur 事件上,我将其设置为 false。我调用这个脚本的页面加载事件:

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

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

于 2008-09-03T23:44:06.137 回答
1

这是浪费,很简单

这是你需要做的

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

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

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

于 2012-01-02T16:44:16.023 回答
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

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

于 2008-09-04T15:21:46.117 回答
0

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

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

function setFocus() {
    document.getElementById(focusControlID).focus();
}
于 2009-06-29T17:11:34.137 回答
0

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

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

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

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

这消除了 javascript 运行时错误,将焦点放在所需的 TextBox 控件上,并将光标也放在控件内。如果没有先模糊然后聚焦,控件将被突出显示,就好像它有焦点一样,但光标还不会位于控件中。用户仍然需要在控件内部单击才能开始编辑,这将是 UX 的烦恼。

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

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

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

于 2010-03-23T16:14:36.453 回答