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

时间:2011-07-01 14:34:08

标签: c# asp.net focus postback dopostback

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

  

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

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

public virtual void Focus()
  

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分: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);
    }