Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用PostBackOptions.TrackFocus在回发中保持控制焦点_C#_Asp.net_Focus_Postback_Dopostback - Fatal编程技术网

C# 使用PostBackOptions.TrackFocus在回发中保持控制焦点

C# 使用PostBackOptions.TrackFocus在回发中保持控制焦点,c#,asp.net,focus,postback,dopostback,C#,Asp.net,Focus,Postback,Dopostback,在后卫线上保持专注显然是一项困难的任务。搜索谷歌,你会发现很多人都渴望同样的东西,但他们的连接方式都不一样,而且大多是定制的。我希望避免自定义实现,尤其是在.NET支持的情况下。只是在深入搜索之后,我才发现PostBackOptions.TrackFocus,在另一篇堆栈溢出文章中悄然提到。根据MSDN: 获取或设置一个值,该值指示回发事件是否应将页面返回到当前滚动位置,并将焦点返回到当前控件。“ 天哪,这是由.NET 4支持的?太棒了。但是我们有大量自定义控件,.NET如何知道如何设置控件的焦

在后卫线上保持专注显然是一项困难的任务。搜索谷歌,你会发现很多人都渴望同样的东西,但他们的连接方式都不一样,而且大多是定制的。我希望避免自定义实现,尤其是在.NET支持的情况下。只是在深入搜索之后,我才发现PostBackOptions.TrackFocus,在另一篇堆栈溢出文章中悄然提到。根据MSDN:

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

天哪,这是由.NET 4支持的?太棒了。但是我们有大量自定义控件,.NET如何知道如何设置控件的焦点?我不知道。查看System.Web.UI.control的MSDN文档,有一个有趣的方法:

public virtual void Focus()
“使用Focus方法将网页的初始焦点设置为 控制该页面将在浏览器中使用控件打开 选定。”

好的,显然是可以重写的。但是推荐的重写方法是什么?它返回void。没有示例。找不到任何人在其实现中重写此方法的示例。但是,在重写它并只执行抛出异常之后,很明显ASP.NET并不是以这种方式关注控件的在帖子发回之前,它就有了焦点:它永远不会被调用

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


这就是我目前所处的困境。看起来,不管怎样,我都需要调用所有东西。关于TrackFocus使用的文档非常少。那么,有没有人从这里得到任何提示?

我一直在使用本文中的方法维护focus accross回发: (即:将焦点存储在所有控件的“输入事件客户端”字段上的“上次焦点隐藏”字段中)

如果你已经在页面上显示了u_ulastFocus,那么这会让你在剩下的大部分时间里

注意:如果能找到一种方法来防止额外的javascript膨胀,那就太好了


这对我来说非常有效,直到我发现我的一些页面包含隐藏的u LASTFOCUS字段,而我的一些页面没有。(这就是促使我四处搜索并找到你的问题的原因)现在我只是想弄清楚如何确保u LASTFOCUS始终显示在我想要跟踪焦点的每个页面上。。。(看起来我必须另外问一个问题)

我刚才就是这么做的。假设您的代码中有一个处理程序,负责处理事件,并且有如下签名:

protected void myEventHandler(object sender, EventArgs e)
    protected void CityListDropDown_SelectedIndexChanged(object sender, EventArgs e)
    {
        ...
        ScriptManager.RegisterStartupScript(CityListDropDown, CityListDropDown.GetType(), "CityDropDownRefocus", "document.getElementById(\"" + CityListDropDown.ClientID + "\").focus();", true);
    }
您可以使用这行代码将焦点恢复回发送对象:

        ScriptManager.RegisterStartupScript((WebControl) sender, sender.GetType(), "RestoreFocusMethod", "document.getElementById(\"" + ((WebControl) sender).ClientID + "\").focus();", true);
仅使用发送控件的Focus()方法将重新定位页面(如果向下滚动了一点),但效果很好。如果您的控件具有特定的处理程序,则只需使用控件本身,而不必将发送者强制转换为网络控件,如下所示:

protected void myEventHandler(object sender, EventArgs e)
    protected void CityListDropDown_SelectedIndexChanged(object sender, EventArgs e)
    {
        ...
        ScriptManager.RegisterStartupScript(CityListDropDown, CityListDropDown.GetType(), "CityDropDownRefocus", "document.getElementById(\"" + CityListDropDown.ClientID + "\").focus();", true);
    }

我的问题是我无法控制LASTFOCUS。我没有把它放在那里:我不知道ASP是如何使用它的,是什么让我有权仅仅因为我能够在客户端编写脚本就去处理它?如果ASP随机拿走它会怎么样?(就像它对你做的那样)不好。如果要这样做,为什么不在母版页中添加自己的自定义lastfocus隐藏元素呢?还有一个问题:在回发后向页中添加控件。将最后一个焦点存储在隐藏元素中,然后回发。在页中具有焦点的控件上方动态添加一个控件:现在是唯一的ClientId c挂起,您的控件将不会保持焦点,因为其ID已更改。@Sam.Rueby我认为,只要控件的ID在回发过程中没有更改,此方法应该仍然有效?特别是如果您创建一个单独的u LASTFOCUS隐藏字段。注:Page.SetFocus()在所有页面加载中,将确保存在“LASTFOCUS”,并在此处询问和回答: