开发者

ASP.NET AJAX UpdatePanel scrolling problem

I'll try and be concise:

  1. I have a dropdownlist with Autopostback set to true
  2. I have an UpdatePanel that contains a Label.
  3. When the downdownlist selection is changed, I want to update the label.

Problem: Focus is lost on the dropdownli开发者_如何转开发st, forcing the user to click on the dropdownlist to reset focus back to the control.

My "solution": In the DropDownList_SelectionChanged event, set focus back to the drop down list:

dropdownlist1.focus()

While this works great in IE, Firefox and Chrome change the scroll position such that the control which was assigned focus is positioned at the bottom on the visible portion of the browser window. This is often a very disorientating side effect.

How can this be avoided so it works in FF as it does in IE?


Try MaintainScrollPositionOnPostback in one of these 3 ways

  • Programmatically - Page.MaintainScrollPositionOnPostBack = true;
  • Page declaration - <%@ Page MaintainScrollPositionOnPostback="true" %>
  • In the web.config - <pages maintainScrollPositionOnPostBack="true" />

You may also need to add this javascript after the scriptmanager declaration:

<script type="text/javascript">

var prm = Sys.WebForms.PageRequestManager.getInstance();

prm.add_beginRequest(beginRequest);

function beginRequest()
{
    prm._scrollPosition = null;
}

</script> 


Velika - Sorry for the delay. If you are using a master page add :

<asp:ScriptManagerProxy runat="server" ID="smp"></asp:ScriptManagerProxy>

Otherwise just add

<asp:ScriptManager runat="server" id="sm" />


Had the exact same issue and got the answer. Hope this helps : http://forums.asp.net/p/1622050/4164858.aspx#4164858

 <script type="text/javascript">  
 var xPos, yPos;  
 var postBackElement;  

 var prm = Sys.WebForms.PageRequestManager.getInstance();  
 prm.add_endRequest(EndRequestHandler);  
 prm.add_initializeRequest(InitializeRequest);  

 function EndRequestHandler(sender, args) {  
     if (postBackElement != null) {  
         document.getElementById(postBackElement.id).focus();  
     }  
 }  
 function InitializeRequest(sender, args) {    
      postBackElement = args.get_postBackElement();    
  }            


try this one

<script type="text/javascript">
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_beginRequest(beginRequest);

    function beginRequest() {
        prm._scrollPosition = window.top;
    }
</script> 


public static void SetFocusByJavaScript(Page page, string clientID)
        {
            string uniqueScriptId = String.Concat("focusScript", clientID);
            string scriptBody = String.Format("setTimeout(\"$get('{0}').focus();\", 100);", clientID);
            ScriptManager.RegisterStartupScript(page, page.GetType(), uniqueScriptId, scriptBody, true);
        }

This is how I have been getting around this issue. The example requires jquery, but you could rewrite if needed. Basically just delays the focus script.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜