在updatepanel部分回发后维护页面滚动位置

时间:2014-05-23 19:16:46

标签: c# asp.net scroll updatepanel postback

我是ASP.NET的初学者,在部分回发UpdatePanel后,我在维护页面的滚动位置时遇到问题。我尝试在MaintainScrollPositionOnPostback="true"中设置<%@ Page Language="C#" ...%>,但它没有做到这一点。请注意我正在使用(并且必须使用)FireFox。

任何帮助将不胜感激。谢谢!这是我的代码:

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<asp:HiddenField ID="ClassificationHiddenField" runat="server" />
<asp:HiddenField ID="DateHiddenField" runat="server" />
<table>
    <tr>
        <td>
            <asp:Panel ID="GroupTitlePanel" CssClass="titlePanelBold" BorderStyle="Ridge" runat="server"
                Width="400px">
                <table id="MainTable">
                    <tr>
                        <td align="center" class="style3">
                            <asp:Label ID="GroupLabel" runat="server">
                            </asp:Label>
                        </td>
                        <td align="center" class="style4">
                            <asp:Label ID="ReturnLabel" runat="server" Text="Expected Return">
                            </asp:Label>
                        </td>
                    </tr>
                </table>
            </asp:Panel>
            <br />
            <asp:Panel ID="GroupMainPanel" runat="server" Width="400px">
            </asp:Panel>
        </td>
        <td width='100px'>
        </td>
        <td>
        </td>
    </tr>
</table>
<asp:Panel ID="BottomPanel" runat="server" BorderStyle="Ridge">
    <table>
        <tr>
            <td align="center">
                <br />
                <asp:ToolkitScriptManager ID="ToolkitScriptManager1" EnablePartialRendering="true"
                    runat="server">
                </asp:ToolkitScriptManager>
                <asp:CheckBoxList runat="server" ID="GroupCheckBoxList" RepeatColumns="10" RepeatDirection="Horizontal"
                    RepeatLayout="Table" AutoPostBack="true" ClientIDMode="AutoID" OnSelectedIndexChanged="GroupCheckBoxList_SelectedIndexChanged">
                </asp:CheckBoxList>
            </td>
        </tr>
        <tr>
            <td>
                <asp:UpdatePanel ID="GroupUpdatePanel" runat="server" Visible="true" UpdateMode="conditional">
                    <ContentTemplate>
                        <asp:Panel ID="GroupGraphPanel" runat="server" Visible="true">
                        </asp:Panel>
                    </ContentTemplate>
                    <Triggers>
                        <asp:AsyncPostBackTrigger ControlID="GroupCheckBoxList" EventName="SelectedIndexChanged" />
                    </Triggers>
                </asp:UpdatePanel>
            </td>
        </tr>
    </table>
</asp:Panel>

4 个答案:

答案 0 :(得分:3)

这看起来像是你问题的答案。作为一个加号;它似乎适用于每个浏览器而不仅仅是FF。

http://www.c-sharpcorner.com/Blogs/11804/maintain-scroll-position-on-postback-within-updatepanel.aspx

  

如果您使用IE,那么它非常简单,只需将代码放入您的   页面指​​令。

<%@ Page Language="C#" AutoEventWireup="true" 
 CodeFile="Default.aspx.cs" Inherits="_Default"
 MaintainScrollPositionOnPostback="true" %> 
  

但由于您必须添加一个浏览器,因此无法在Firefox中使用   存入您的网站

     

右键单击解决方案资源管理器&gt;添加新项目

     

选择浏览器文件并将其添加到App_Browsers文件夹。

     

将KeeptainScrollPositionOnPostback功能添加到此浏览器文件中   如下所示。

<browsers>
  <browser refID="Mozilla">
      <capabilities>
        <capability name="supportsMaintainScrollPositionOnPostback" value="true" />       
    </capabilities>   
  </browser>
</browsers>
  

有时候这也行不通,

     

然后一个简单的解决方案就是在网格后添加一个空白的Update面板   和onpostback只是将焦点放在它将工作的更新面板上   任何浏览器。                 在cs postbackevent updatepanel1.Focus();

     

如果有任何问题,请随时提出或任何修改回复。

答案 1 :(得分:1)

虽然我知道你不熟悉javascript,但我仍然建议给你这个答案,因为在.net中没有内置的解决方案,但是你可以用javascript来解决它。不要担心Javascript不强硬,是Web开发的重要组成部分之一。所以试一试吧。可以帮到你。

您可以参考此页:Maintaining page scroll position after updatepanel partial postback

<form id="form1" runat="server">
  <asp:ScriptManager ID="SM1" runat="server" ScriptMode="Release" />
   <script type="text/javascript">
      // It is important to place this JavaScript code after ScriptManager1
      var xPos, yPos;
      var prm = Sys.WebForms.PageRequestManager.getInstance();

      function BeginRequestHandler(sender, args) {
        if ($get('<%=Panel1.ClientID%>') != null) {
          // Get X and Y positions of scrollbar before the partial postback
          xPos = $get('<%=Panel1.ClientID%>').scrollLeft;
          yPos = $get('<%=Panel1.ClientID%>').scrollTop;
        }
     }

     function EndRequestHandler(sender, args) {
         if ($get('<%=Panel1.ClientID%>') != null) {
           // Set X and Y positions back to the scrollbar
           // after partial postback
           $get('<%=Panel1.ClientID%>').scrollLeft = xPos;
           $get('<%=Panel1.ClientID%>').scrollTop = yPos;
         }
     }

     prm.add_beginRequest(BeginRequestHandler);
     prm.add_endRequest(EndRequestHandler);
 </script>

 <asp:UpdatePanel ID="UpdatePanel1" runat="server">
   <ContentTemplate>
     <asp:Panel ID="Panel1" runat="server" Height="300">
        <%-- Some stuff which would cause a partial postback goes here --%>
     </asp:Panel>
   </ContentTemplate>
 </asp:UpdatePanel>

答案 2 :(得分:1)

您可以将焦点设置在您希望在屏幕上看到的控件上。

例如,如果下拉列表&#34; ddlCity&#34;是导致回发的控件,然后在下拉列表SelectedIndexChanged代码后执行以下操作:

ddlCity.Focus();

答案 3 :(得分:0)

我能够通过以下黑客解决类似的问题:

将HiddenField Control添加到您正在使用的页面或控件中。确保将ClientIDMode设置为静态,以便在JavaScript中轻松访问它。我们将使用JavaScript来更新此控件:

<asp:HiddenField ID="scrollPosition" ClientIDMode="Static" runat="server" /> 

另外添加一个面板控件作为我们将插入一些javascript的目标:

<asp:Panel ID="pnlScriptRunner" runat="server"></asp:Panel>

添加以下JavaScript。使用window.onscroll函数,我们正在更新我们的HiddenField控件。 updateScrollPosition函数将从我们的C#代码后面调用:

<script> 
     window.onscroll = function () {
          var ctrl = document.getElementById("scrollPosition");
          ctrl.value = document.body.scrollTop;
          console.log(ctrl.value);
     };

     function updateScrollPosition(value) {       
         window.scrollTo(0, value);
         console.log("updating scroll position");
     }
</script> 

创建一个新的C#类并添加以下方法。这将允许我们从C#中的代码隐藏中插入一些Javascript:

public static class ClientScript
{
    public static void InsertScript(string script, Control target)
    {
        HtmlGenericControl s = new HtmlGenericControl();
        s.TagName = "script";
        s.InnerHtml = script;
        target.Controls.Add(s); 
    }        
}

现在,在您的控件或页面的代码中,调用JavaScript函数&#34; updateScrollPosition(value)&#34;使用我们创建的静态类将javascript插入到pnlScriptRunner中,使用ASP.NET HiddenField Control中的值:

    protected void btnRotate_Click(object sender, EventArgs e)
    {
         //Do stuff with controls in your update panel here, then: 
         ClientScript.InsertScript("updateScrollPosition(" + scrollPosition.Value + ");", pnlScriptRunner);
         UpdatePanel1.Update();

    }

我的btnRotate_Click事件在更新面板中注册为触发器:

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
     <ContentTemplate>
         <b>Image Preview: </b><br />
         <asp:Image ID="img" runat="server" CssClass="profileImage" />
         <br /> 
         <br />
         <asp:Button ID="btnRotate" runat="server" Text="Rotate Image" ClientIDMode="Static" OnClick="btnRotate_Click" />
         <br />
         <br />
      </ContentTemplate>
      <Triggers>
           <asp:PostBackTrigger ControlID="btnRotate" />
      </Triggers>
</asp:UpdatePanel>

以下参考资料是必要的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

希望这有帮助!