使用PostBackOptions.TrackFocus在后置文件中保持控制焦点

保持对后卫的关注是一项显然很困难的任务。 搜索谷歌,你会发现很多人都渴望同样的东西,但所有人都有不同的联系,而且主要是定制的。 我想避免自定义实现,特别是如果它支持.NET的方式。 经过一些非常深入的搜索,我遇到了PostBackOptions.TrackFocus,在另一个堆栈溢出post中静静地提到。 根据MSDN:

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

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

public virtual void Focus() 

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

好吧,显然可以覆盖。 但是这样做的推荐方法是什么? 它返回void。 没有例子。 无法在实现中找到任何覆盖此方法的人的示例。 但是,在重写它并且除了抛出exception之外什么也没做什么之后,很明显,这不是ASP.NET如何专注于在回发之前具有焦点的控件:它永远不会被调用。

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

这是我目前陷入困境的地方。 看起来好像我需要把所有东西都叫做__doPostBack,无论如何。 有关TrackFocus使用的非常非常少的文档。 那么有人从这里得到任何提示吗?

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

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

如果你已经将__LASTFOCUS显示在页面上,那么这应该可以让你完成其余的大部分工作……

注意:很高兴找到一种方法来保持额外的javascript免于膨胀__VIEWSTATE例如。

在我发现我的一些页面包含隐藏的__LASTFOCUS字段并且我的一些页面没有包含它之前,它对我来说效果很好。 (这就是促使我四处搜寻并找到你问题的原因)现在我只想弄清楚如何确保__LASTFOCUS始终显示在我想跟踪焦点的每一页上……(看起来我会关于它必须打开一个单独的问题)

这就是我刚刚做的。 假设你的代码后面有一个处理程序来处理事件,并且有这样的签名:

 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); }