2009-02-12 13 views
7

मेरे पास एक अपडेट पैनल के अंदर एक सूची बॉक्स है। जब मैं नीचे स्क्रॉल करता हूं और किसी आइटम का चयन करता हूं, तो यह सूचीबॉक्स के शीर्ष पर वापस स्क्रॉल करता है। मैंने सुना है कि डोम पोस्टबैक पर स्क्रॉल स्थिति का ट्रैक नहीं रखता है। क्या किसी को हल करने के तरीके पर समाधान/उदाहरण है?अपडेट पैनेल में सूची बॉक्स में स्क्रॉल स्थिति बनाए रखें, पृष्ठ

धन्यवाद, XaiSoft

उत्तर

7

आप इस समस्या में चल रहे हैं, क्योंकि UpdatePanel पूरी तरह से एक नया एक के साथ अपने स्क्रॉल <select> तत्व की जगह जब अतुल्यकालिक अनुरोध वापस आता है।

संभावित समाधान:

  1. उपयोग जावास्क्रिप्ट एक छिपे फ़ॉर्म एलीमेंट में पहले UpdatePanel प्रस्तुत किया जाता है और उसके बाद पर स्थापित (ClientScriptManager.RegisterOnSubmitStatement विधि को फोन करके) <select> तत्व की scrollTop संपत्ति स्टोर करने के लिए नया <select> जब AJAX कॉल वापस आता है। यह कठिन, त्रुटि-प्रवण होगा, और शायद बहुत संगत नहीं होगा (here देखें)।

  2. <select> की selectedIndex संपत्ति को संग्रहीत करने के लिए जावास्क्रिप्ट का उपयोग करें और AJAX कॉल वापस आने पर उस आइटम को फिर से चुनें। स्पष्ट रूप से यह काम नहीं करेगा अगर उपयोगकर्ता ने अभी तक कुछ भी नहीं चुना है।

  3. Don't use UpdatePanels। इसके बजाय jQuery + ASP.NET page methods आज़माएं।

+1

मुझे यह समाधान मिला और वास्तव में यह काम किया। http://basgun.wordpress.com/2008/06/09/maintain-scroll-position-updatepanel-postback/ – Xaisoft

+0

अच्छा। ऐसा लगता है कि IE6 पर selectTop के साथ कोई समस्या है। इस पृष्ठ पर पहली टिप्पणी बताती है कि आप इसके आसपास कैसे हो सकते हैं: http://geekswithblogs.net/lorint/archive/2005/12/16/63289.aspx –

0

ऐसा लगता है कि निम्नलिखित तरीके से निम्न कोड उदाहरण स्क्रॉल:

  • इंटरनेट एक्सप्लोरर 8: चयनित आइटम पोस्टबैक के बाद पहला दृश्य मद है।

  • फ़ायरफ़ॉक्स: पोस्टबैक के बाद चयनित आइटम हमेशा दिखाई देता है (लेकिन अंतिम दृश्य आइटम हो सकता है)।

  • क्रोम: पोस्टबैक के बाद, चयनित आइटम छुपाया जा सकता है क्योंकि सूची बॉक्स शीर्ष पर स्क्रॉल करता है, जैसा कि आप कहते हैं।

 
<asp:UpdatePanel ID="up1" runat="server"> 
    <ContentTemplate> 
     <asp:ListBox ID="lb1" runat="server" Height="100px" AutoPostBack="true"> 
      <asp:ListItem>A</asp:ListItem> 
      <asp:ListItem>B</asp:ListItem> 
      <asp:ListItem>C</asp:ListItem> 
      <asp:ListItem>D</asp:ListItem> 
      <asp:ListItem>E</asp:ListItem> 
      <asp:ListItem>F</asp:ListItem> 
      <asp:ListItem>G</asp:ListItem> 
      <asp:ListItem>H</asp:ListItem> 
     </asp:ListBox> 
    </ContentTemplate> 
</asp:UpdatePanel> 
+0

फ़ायरफ़ॉक्स चयनित आइटमों के लिए शीर्ष पर अप्रत्याशित रूप से स्क्रॉल करता है। सबसे पहले, मैंने सोचा कि यह सूची बॉक्स में आइटम्स की संख्या के कारण हो सकता है, लेकिन जब कोई विशेष आइटम चुनते हैं ... कभी-कभी यह पोस्टबैक के बाद दिखाई देता है, और कभी-कभी फ़ायरफ़ॉक्स शीर्ष पर स्क्रॉल करता है। सूची का पुनर्निर्माण नहीं किया जा रहा है और जब भी कोई आइटम क्लिक किया जाता है, वही बात तब होती है, इसलिए यह स्पष्ट रूप से फ़ायरफ़ॉक्स बग है, और यह अभी भी संस्करण 3.0.13 के रूप में मौजूद है। – Triynko

4
var xPos, yPos; 
    var prm = Sys.WebForms.PageRequestManager.getInstance(); 

    function BeginRequestHandler(sender, args) { 
     if (($get('Panel1')) != null) { 
      xPos = $get('Panel1').scrollLeft; 
      yPos = $get('Panel1').scrollTop; 
     } 
    } 

    function EndRequestHandler(sender, args) { 
     if (($get('Panel1')) != null) { 
      $get('Panel1').scrollLeft = xPos; 
      $get('Panel1').scrollTop = yPos; 
     } 
    } 
    prm.add_beginRequest(BeginRequestHandler); 
    prm.add_endRequest(EndRequestHandler); 

    //Note: "Panel1" Panel or div u want to maintain scroll position 
    //Note: This Java Script should be added after Scriptmanager***** 

// बाहर अद्यतन पैनल के साथ पैनल/डिव के लिए स्क्रॉल स्थिति को बनाए रखने

window.onload = function() { 
     var strCook = document.cookie; 
     if (strCook.indexOf("!~") != 0) { 
      var intS = strCook.indexOf("!~"); 
      var intE = strCook.indexOf("~!"); 
      var strPos = strCook.substring(intS + 2, intE); 
      document.getElementById('Panel1').scrollTop = strPos; 
     } 
    } 
    function SetDivPosition() { 
     var intY = document.getElementById('Panel1').scrollTop; 
     document.title = intY; 
     document.cookie = "yPos=!~" + intY + "~!"; 
    } 


    //Note: "Panel1" Panel id or div id for which u want to maintain scroll position 
+0

मुझे थोड़ा बदलाव करना पड़ा और इसे काम करने के लिए निम्नलिखित का उपयोग करना पड़ा: 'yPos = $ ('# <% = MyListBox.ClientID%>')। ScrollTop();' startRequestHandler' में डेटा निकालने के लिए, और '$ ('# <% = MyListBox.ClientID%>')। ScrollTop (yPos); 'इसे' endRequestHandler' में वापस रखने के लिए। – atconway

0

तुम अब भी UpdatePanel एक ListBox युक्त का उपयोग कर आंशिक पोस्टबैक प्राप्त कर सकते हैं, लेकिन यह को रोकने के UpdatePanel पर निम्नलिखित सेट करके एक नए उदाहरण द्वारा अधिलेखित होने से:

ChildrenAsTriggers="False" 

यह MSDN में कहा गया है:

हो जाता है या एक मूल्य इंगित करता है कि एक UpdatePanel नियंत्रण के तत्काल बच्चे नियंत्रण से Postbacks पैनल की सामग्री को अद्यतन है कि क्या तय करता है। यदि आप अपडेटपैनल नियंत्रण के तत्काल बाल नियंत्रण से पर पैनल की सामग्री के अपडेट का कारण बनते हैं, तो क्या आप 0Aपोस्टबैक को झूठ में सेट नहीं करना चाहते हैं।

यह करने के लिए एक चेतावनी है अगर आप सर्वर साइड (यानी Postbacks पर आइटम के लिए CSS विशेषताएं जोड़ना) से ListBox के लिए किसी भी अन्य दृश्य में गड़बड़ी करने के लिए कोशिश कर रहे हैं, तो आप नहीं देखेंगे उन्हें जब तक प्रस्तुत करना एक और असंबंधित पोस्टबैक होता है। यदि आप कर रहे हैं तो ChildrenAsTriggers="False" सेट करने से चयन करना है।

0

एंटरप्राइज़ एप्लिकेशन के लिए मैं काम कर रहा था, यह पता चला कि मास्टरपेज.मास्टर पेज Sys.WebForms.PageRequestManager.getInstance() को जोड़ रहा था। Add_endRequest ईवेंट और इसके अंदर window.scroll (0,0) सेटिंग। सामग्री पृष्ठ स्पष्ट रूप से contentpage के UpdatePanel के प्रत्येक ट्रिगर पर window.scroll (0,0) निष्पादित कर रहे थे। मैंने सामग्री पृष्ठ में add_endRequest कार्यक्षमता को ओवरराइड करने का प्रयास किया लेकिन इसे काम करने के लिए नहीं मिला। आखिरकार मैंने मास्टर.मास्टर को विंडो.scroll (0,0) नहीं करने के लिए संशोधित किया।

संबंधित मुद्दे