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

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>
Alle Antworten
-
Hallo Jessica,
Mögliche Ansätze ggf.:[Page.MaintainScrollPositionOnPostBack-Eigenschaft (System.Web.UI)]
http://msdn.microsoft.com/de-de/library/system.web.ui.page.maintainscrollpositiononpostback.aspx[Scroll Gridview while Maintaining Scroll Position - CodeProject]
http://www.codeproject.com/KB/aspnet/Scroll_gridview_Position.aspx[Maintain GridView Scroll Position and Header Inside Update Panel - CodeProject]
http://www.codeproject.com/KB/aspnet/AjaxScroll.aspx____________
die Frage hätte IMHO eher in das folgendes Forum gehört:[ASP.NET Forum]
http://social.msdn.microsoft.com/Forums/de-de/aspnetajaxmvcde/threads
ciao Frank- Geteilt Robert BreitenhoferModerator Mittwoch, 8. September 2010 13:55 Zum Splitten
- Zusammengeführt Robert BreitenhoferModerator Mittwoch, 8. September 2010 13:59 Gehoert zu WPF
-
So, bevor ich jetzt den Hauptpost weiter editiere und Verwirrung stifte, mal ein kleines Update als neuen Post, der Übersichtlichkeit halber:
Mir ist aufgefallen, dass Visual Studio mir folgende Zeile als Fehler markiert:
top: expression(this.offsetParent.scrollTop);
Mit dem Hinweis: "expression(this.offsetParent.scrollTop)" ist kein gültiger Wert für die top-Eigenschaft.
Funktioniert es deswegen vielleicht nicht?