none
Wie stelle ich die Scrollposition eines Panels / GridView nach einem PostBack wieder her (bzw. behalte sie bei)? RRS feed

  • Frage

  • Ich hoffe das hier wird nicht als Crossposting gewertet. Ich habe die Frage fälschlicherweise in einem anderen Forenbereich (.NET-Framework) gepostet und wurde auf diesen hier verwiesen. (http://social.msdn.microsoft.com/Forums/de-DE/dotnetframeworkde/thread/b10dffcb-f994-45c2-8d67-d56cf2dc4965 )

    Zur eigentlichen Frage:

    Ich habe ein GridView, das in/auf einem Panel liegt. Das Paging vom GridView ist deaktiviert; stattdessen stelle ich es mit Hilfe des Panels mit einer vertikalen Scrollbar dar. Klickt der Benutzer auf eine Row, wird diese selektiert und löst einen Postback aus. Dadurch ist die Scrollposition des Panels wieder ganz oben, was mir im Moment nicht so gefällt.

    Ich habe bereits hiermit versucht, nach dem PostBack die alte Position wiederherzustellen, aber das klappt leider nicht ganz so wie gewünscht:

    this.GridViewVorhaben.SelectedRow.Focus();

    Einerseits bleibt die selektierte Row nach dem PostBack dann zwar sichtbar, allerdings rutscht sie an das Ende des sichtbaren Bereichs. Die Scrollposition ist also trotzdem anders als vorher.

    Außerdem habe ich den Header des GridViews als "absolute" angegeben, damit dieser nicht mitscrollt. Selektiert man nun eine Row, die weiter unten liegt, ist der Header nicht mehr im sichtbaren Bereich. (Bei einer Row, die nur etwas außerhalb des im Grid sichtbaren Bereichs liegt, wird der Header nur ein kleines Stück über dem Grid angezeigt - ich weiß im Moment leider nicht genau woher das kommt, aber so nützt mir das leider nicht viel.)

    Gibt es hierfür eine bessere Lösung? Und falls nicht, wie verhindere ich, dass der Header nach oben verschwindet?

    Gruß,

    Jessica

     

    P.S.:

    Ich habe bereits versucht diese Lösung (http://www.codeproject.com/KB/aspnet/AjaxScroll.aspx ) anzuwenden, bisher jedoch leider ohne Erfolg.

    Möglicherweise liegt es daran, dass ich statt einem div ein Panel benutze? Ist es möglich die Lösung auch darauf anzuwenden oder muss ich die Seite so umbauen, dass ich statt Panels divs verwende?

    Edit:

    Hab's nun mal mit einem div statt des Panels versucht, funktioniert aber genausowenig...

    Hier mal der Code in etwas gekürzter Form dazu:

    <%@ Page Title="" Language="C#" MasterPageFile="~/Default.master" AutoEventWireup="true"
      CodeFile="main.aspx.cs" Theme="main" Inherits="main" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
      <style type="text/css">
        .header
        {
          position: absolute;
          color: White;
          height: 25px;
        }
        .HeaderFreez
        {
          position: relative;
          top: expression(this.offsetParent.scrollTop);
          z-index: 10;
        }
      </style>
    
      <script language="javascript" type="text/javascript">
        // This Script is used to maintain Grid Scroll on Partial Postback
        var scrollTop;
        //Register Begin Request and End Request 
        Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
        //Get The Div Scroll Position
        Function BeginRequestHandler(sender, args) 
        {
          var m = document.getElementById('divVorhaben');
          scrollTop=m.scrollTop;
        }
        //Set The Div Scroll Position
        function EndRequestHandler(sender, args)
        {
          var m = document.getElementById('divVorhaben');
          m.scrollTop = scrollTop;
        } 
      </script>
    </asp:Content>
    
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
      <asp:ScriptManager ID="ScriptManager1" runat="server">
      </asp:ScriptManager>
    
      <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
          <div style="...">
            <asp:ObjectDataSource ID="ObjectDataSourceVorhaben" runat="server" ...></asp:ObjectDataSource>
            <asp:Panel ID="Panel1" runat="server" Height="400px">
              <div id="divVorhaben" style="width: 1000px; height: 400px; overflow: auto;">
                <asp:GridView ID="GridViewVorhaben" runat="server" DataSourceID="ObjectDataSourceVorhaben" Height="400px" AutoGenerateColumns="False" OnSelectedIndexChanged="GridViewVorhaben_SelectedIndexChanged"
                  DataKeyNames="Id" OnRowDataBound="GridViewVorhaben_RowDataBound" ...>
                  <RowStyle ... />
                  <Columns>
                    ...
                  </Columns>
                  <FooterStyle ... />
                  <PagerStyle ... />
                  <SelectedRowStyle ... />
                  <HeaderStyle CssClass="HeaderFreez" BackColor="#5D7B9D" Font-Bold="True" />
                  <EditRowStyle ... />
                  <AlternatingRowStyle ... />
                </asp:GridView>
              </div>
            </asp:Panel>
          </div>
          
    	  <div> ... zweites GridView, etc. </div>
    
        </ContentTemplate>
      </asp:UpdatePanel>
    </asp:Content>
    

     

    Dienstag, 27. Juli 2010 13:48

Alle Antworten