2009-07-07 17 views
10

पर किसी पृष्ठ के भीतर एक div की स्क्रॉल स्थिति बनाए रखें मेरे पास ओवरफ्लो सेट ऑटो के साथ एक एएसपीएक्स पेज के भीतर एक div है। Div की सामग्री गतिशील रूप से बनाई गई है और इसमें लिंक बटन की एक सूची शामिल है।पोस्टबैक

<div id="div1" style="overflow: auto; height: 100%;"> 
..... 
</div> 

जब मैं div में नीचे स्क्रॉल और लिंक बटन में से किसी पर क्लिक करें, पृष्ठ पुनः लोड div अंदर स्क्रॉल स्थिति खो देता है और मुझे div के शीर्ष पर ले जाता। क्या इसे रोकने का कोई तरीका है?

ध्यान दें कि यह पृष्ठ के अंदर एक div के लिए है। Page.MaintainScrollPositionOnPostBack() काम नहीं करता है।

+1

हटा पोस्टबैक एक्स) –

उत्तर

14

जैसा कि जेफ एस ने इस स्थिति को संभालने का एक तरीका बताया है, div की स्क्रॉल स्थिति को ट्रैक करने के लिए जावास्क्रिप्ट का उपयोग कर रहा है और प्रत्येक बार पृष्ठ लोड स्क्रॉल स्थिति को उसके पिछले मान पर रीसेट कर देता है।

<html> 
<body onload="javascript:document.getElementById('div1').scrollTop = document.getElementById('scroll').value;"> 
    <form id="form1" runat="server"> 
    <input type="hidden" id="scroll" runat="server" /> 
    <div id="div1" style="overflow: auto; height: 100px;" onscroll="javascript:document.getElementById('scroll').value = this.scrollTop"> 
     ...........<br /> 
     ...........<br /> 
     ...........<br /> 
     ...........<br /> 
     ...........<br /> 
     ...........<br /> 
     ...........<br /> 
     ...........<br /> 
     ...........<br /> 
     ...........<br /> 
     ...........<br /> 
     ...........<br /> 
     <asp:LinkButton ID="LinkButton1" runat="server" Text="test2"></asp:LinkButton> 
    </div> 
    <asp:LinkButton ID="LinkButton2" runat="server" Text="test1"></asp:LinkButton> 
    </form> 
</body> 
</html> 

व्यवहार में मैं नहीं तत्वों लेकिन इसकी सिर्फ एक उदाहरण में सीधे जावास्क्रिप्ट डाल होगा:

यहां कुछ नमूना कोड है। आप इसके बजाय एक कुकी में स्क्रॉल स्थिति भी स्टोर कर सकते हैं।

5

अद्यतनपैनल में नियंत्रण को लपेटना सबसे आसान तरीका है।

+0

त्वरित , थोड़ा गंदे, लेकिन काम करता है! मुझें यह पसंद है। –

0

लिंक बटन दबाए जाने पर क्या होता है? पोस्टबैक के दौरान क्या प्रसंस्करण होता है?

उन सवालों के जवाबों के आधार पर, आप पूरी तरह से पोस्टबैक से छुटकारा पाने और पूरी तरह से क्लाइंट-साइड के आवश्यक संचालन करने की जांच कर सकते हैं।

(मैं वर्तमान में एक ग्राहक के लिए रूपांतरण के इस प्रकार के प्रदर्शन कर रहा हूँ।)

+0

जब लिंक बटन दबाया जाता है, तो यह पृष्ठ पर मौजूद ग्राफ़ नियंत्रण को पॉप्युलेट करता है। ऐसा लगता है कि इसे क्लाइंट साइड पर प्रदर्शन करना सबसे अच्छा तरीका है – Nikhil

1

एक तरह से यह कब्जा करने के लिए है करने के लिए, div के Onscroll घटना में, scrollLeft, और scrollTop गुण से मान। उन मानों को एक छिपे हुए टेक्स्ट बॉक्स (es) में सहेजें। पोस्ट बैक पर, गुणों को रीसेट करने के लिए टेक्स्ट बॉक्स से मानों का उपयोग करें।

3
using System; 
using System.ComponentModel; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

[ParseChildren(true, "Content")] 
public class ScrollSaverPanel: WebControl 
{ 
    [TemplateInstance(TemplateInstance.Single)] 
    [PersistenceMode(PersistenceMode.InnerProperty)] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    public ITemplate Content { get; set; } 

    private HiddenField HiddenField { get; set; } 

    protected override HtmlTextWriterTag TagKey 
    { 
     get 
     { 
      return HtmlTextWriterTag.Div; 
     } 
    } 

    protected override void OnInit(EventArgs e) 
    { 
     HiddenField = new HiddenField(); 

     var metaContainer = new WebControl(HtmlTextWriterTag.Div); 
     metaContainer.Controls.Add(HiddenField); 
     metaContainer.Style.Add(HtmlTextWriterStyle.Display, "none"); 

     Controls.Add(metaContainer); 

     var contentContainer = new WebControl(HtmlTextWriterTag.Div); 
     Controls.Add(contentContainer); 

     Content.InstantiateIn(contentContainer); 

     this.Style.Add(HtmlTextWriterStyle.Overflow, "auto"); 
     this.Attributes.Add("onscroll", string.Format("javascript:document.getElementById('{0}').value = this.scrollTop;", HiddenField.ClientID)); 

     base.OnInit(e); 
    } 

    protected override void OnPreRender(EventArgs e) 
    { 
     ScriptManager.RegisterStartupScript(this, this.GetType(), "setscroll", string.Format("javascript:document.getElementById('{0}').scrollTop = '{1}';", this.ClientID, HiddenField.Value), true); 
     base.OnPreRender(e); 
    } 
} 

उपयोग:

<general:ScrollSaverPanel runat="server"> 
    <Content> 
     <stwrw:Group runat="server" ID="rootGroup"/> 
    </Content> 
</general:ScrollSaverPanel> 

के बाद से कुछ लोगों को स्क्रॉल स्थिति को बचाने के एकमात्र उद्देश्य के लिए एक UpdatePanel का उपयोग नहीं करना चाहते हैं ... :)