3

在后背上保持专注显然是一项艰巨的任务。搜索谷歌,你会发现很多人都渴望同样的东西,但都以不同的方式联系起来,而且大多是习惯性的。我想避免自定义实现,特别是如果.NET 支持它的方式。只有经过一些非常深入的搜索,我才遇到 PostBackOptions.TrackFocus,在另一个堆栈溢出帖子中悄悄提到。根据 MSDN:

获取或设置一个值,该值指示回发事件是否应将页面返回到当前滚动位置并将焦点返回到当前控件。"

废话,.NET 4 支持吗?惊人的。但是我们有大量的自定义控件,.NET 怎么知道如何将焦点设置在控件上?我不知道。查看 System.Web.UI.Control 的 MSDN 文档,有一个有趣的方法:

public virtual void Focus()

“使用 Focus 方法将网页的初始焦点设置为控件。该页面将在浏览器中打开并选择控件。”

好吧,显然可以覆盖。但是这样做的推荐方法是什么?它返回无效。没有例子。找不到任何人在其实现中覆盖此方法的示例。然而,在覆盖它并且除了抛出异常之外什么都不做之后,很明显这不是 ASP.NET 将焦点放在回发之前具有焦点的控件上的方式:它永远不会被调用。

在使用 Firebug 进行大量调试后,我发现启用 PostBackOptions.TrackFocus 有效!有时。很明显,控件的焦点只有在控件调用 __doPostBack JavaScript 方法时才会保持。启动 PostBack 的其他控件(当在控件内按 enter 时)调用 WebForm_OnSubmit(),它不会更新 ASP 隐藏字段 __LASTFOCUS。__doPostBack 在设置隐藏字段后调用 WebForm_OnSubmit()。

这是我目前陷入困境的地方。无论如何,我似乎都需要调用 __doPostBack。关于使用 TrackFocus 的文档非常非常少。那么有人有任何提示吗?

4

2 回答 2

1

我一直在使用本文中的方法在回发中保持焦点:(即:将焦点存储在字段上的 __LASTFOCUS 隐藏字段中,为所有控件输入事件客户端)

http://www.codeproject.com/KB/aspnet/MainatinFocusASPNET.aspx

如果您已经让 __LASTFOCUS 出现在页面上,那么这应该可以让您完成剩下的大部分工作......

注意:最好找到一种方法来防止额外的 javascript 膨胀 __VIEWSTATE 例如。

它对我来说工作得很好,直到我发现我的一些页面包含隐藏的 __LASTFOCUS 字段而我的一些页面没有。(这就是促使我四处搜索并找到您的问题的原因)现在我只是想弄清楚如何确保 __LASTFOCUS 始终显示在我想要跟踪关注的每个页面上......(看起来我会必须打开一个单独的问题)

于 2011-07-13T18:52:41.120 回答
0

这是我刚刚做的。假设您的代码中有一个处理程序来处理事件并具有如下签名:

protected void myEventHandler(object sender, EventArgs e)

您可以使用这行代码将焦点恢复到发送对象:

        ScriptManager.RegisterStartupScript((WebControl) sender, sender.GetType(), "RestoreFocusMethod", "document.getElementById(\"" + ((WebControl) sender).ClientID + "\").focus();", true);

仅使用发送控件的 Focus() 方法将重新定位页面(如果您向下滚动一点),但这很有效。如果您的控件有特定的处理程序,则可以只使用控件本身,而不是将发送方强制转换为 WebControl,如下所示:

    protected void CityListDropDown_SelectedIndexChanged(object sender, EventArgs e)
    {
        ...
        ScriptManager.RegisterStartupScript(CityListDropDown, CityListDropDown.GetType(), "CityDropDownRefocus", "document.getElementById(\"" + CityListDropDown.ClientID + "\").focus();", true);
    }
于 2016-04-05T15:49:25.197 回答