2011-01-26 11 views
5

मैं xml डेटा का उपयोग करके दोहराने वाले के भीतर दोहराने की कोशिश कर रहा हूं। मैं इसे ठीक तरह से काम कर रहा हूं जैसा कि मैं चाहता हूं, लेकिन जिस विधि का मैंने उपयोग किया है, वह प्रत्येक पुनरावर्तक के लिए डेटा को पुनः लोड करता है। मुझे लगता है कि मुझे XmlNode के रूप में डालने की ज़रूरत है लेकिन मैं ईमानदार रहूंगा - मुझे नहीं पता कि कहां से शुरू करना है।प्रत्येक पुनरावर्तक के लिए सभी एक्सएमएल डेटा को पुनः लोड करने से बचें - vb.net

यहां मेरा कोड है - यदि संभव हो तो मैं सबकुछ कोड में रखना चाहता हूं।

<script runat="server"> 

Public doc As New XmlDocument() 

Public Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs) 

    If Not Page.IsPostBack then 

     doc.Load(Server.MapPath("~/myxml/bookstore.xml")) 

     Dim nodes As XmlNodeList = doc.SelectNodes("Bookings/Booking[@CLIENT_NO='SA33762']") 
     rpMyRepeater.DataSource = nodes 
     rpMyRepeater.DataBind() 

    End If 

End Sub 

    Protected Sub itemDB(ByVal s As Object, ByVal e As RepeaterItemEventArgs) 
     If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then 

     Dim rpt As Repeater = CType(e.Item.FindControl("books"), Repeater) 

     If Not (rpt Is Nothing) Then 

      doc.Load(Server.MapPath("~/myxml/bookstore.xml")) 

      Dim nodes2 As XmlNodeList = doc.SelectNodes("Bookings/Booking[@CLIENT_NO='SA33762']/Products/Book") 

      rpt.DataSource = nodes2 
      rpt.DataBind() 

     End If 

     End If 
    End Sub 

</script> 

कोई विचार?

उत्तर

1

क्या मुझे यहां कुछ याद आ रही है?

क्या आप अपने दस्तावेज़ डीबी सब के भीतर बस अपने दस्तावेज़ को लोड/हटा नहीं सकते हैं। (सर्वर/मैपपाथ ("~/myxml/bookstore.xml")) बाहर? चूंकि आपने "वैश्विक रूप से" दस्तावेज़ को परिभाषित किया है और इसे पहले ही लोड लोड पर लोड किया है? (करके आप पहले से ही एक्सएमएल पुन: लोड करने से बच सकें जाएगा)

यही कहा, मैं कैस्पर के साथ सहमत हैं कि आप बल्कि (विशेष रूप से अपने कैशिंग क्षमताओं के लिए) XmlDatasource का उपयोग करना चाहिए है, आप का उपयोग करने की जरूरत नहीं आपके मार्कअप के भीतर XmlDatasource - आप हमेशा इसे अपने कोड-बैक के भीतर भी परिभाषित कर सकते हैं - चूंकि आप अपने (एएसपीनेट सर्वर-साइड आधारित) मार्कअप को किसी कारण से मार्कअप के बारे में चिंतित हैं ...

जैसे

Public Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs) Handles Me.Load 

    If Not Page.IsPostBack Then 
     Dim source As New XmlDataSource() 
     source.DataFile = "~/myxml/bookstore.xml" 
     source.XPath = "Bookings/Booking[@CLIENT_NO='SA33762']" 
     rpMyRepeater.DataSource = source 
     rpMyRepeater.DataBind() 
    End If 

End Sub 

मार्कअप:

<asp:Repeater ID="rpMyRepeater" runat="server"> 
    <ItemTemplate> 
     <%#XPath("//Booking/NAME/text()")%> 
     <asp:Repeater runat="server" ID='books' DataSource='<%#XPathSelect("//Booking/Products/Book") %>'> 
      <HeaderTemplate> 
       <h2> 
        Books</h2> 
      </HeaderTemplate> 
      <ItemTemplate> 
       <p> 
        Title: 
        <%#XPath("TITLE/text()")%></p> 
       <p> 
        <%#XPath("BOOKCODE/text()")%></p> 
      </ItemTemplate> 
     </asp:Repeater> 
    </ItemTemplate> 
</asp:Repeater> 

एक्सएमएल (नाइस बात तुम यहाँ पर ध्यान देंगे, कि हम पहले पुनरावर्तक से स्रोत का उपयोग दूसरे पुनरावर्तक बाध्य है)

<?xml version="1.0" encoding="utf-8" ?> 
<Bookings> 
    <Booking CLIENT_NO="SA33762"> 
    <NAME>Mr Pf_Test_15033</NAME> 
    <Products> 
     <Book> 
     <TITLE>My Book</TITLE> 
     <BOOKCODE>12345</BOOKCODE> 
     </Book> 
     <Book> 
     <TITLE>My Book2</TITLE> 
     <BOOKCODE>123456</BOOKCODE> 
     </Book> 
    </Products> 
    </Booking> 
</Bookings> 

ListView नियंत्रण (मेरे पसंदीदा एएसपीनेट नियंत्रण में से एक) का उपयोग करके कार्यान्वयन कुछ इस तरह दिखेगा: (यदि कोई किताबें उपलब्ध है, यह EmptyDataTemplate भीतर मार्कअप प्रदर्शित करेगा) हालांकि मैं एक तरह से सवाल पूछ रहा हूँ यहाँ क्योंकि मैं

<asp:Repeater ID="rpMyRepeater" runat="server"> 
    <ItemTemplate> 
     <%#XPath("//Booking/NAME/text()")%> 
     <asp:ListView runat="server" ID="books" ItemPlaceholderID="phItems" DataSource='<%#XPathSelect("//Booking/Products/Book") %>'> 
      <LayoutTemplate> 
       <h2> 
        Books</h2> 
       <asp:PlaceHolder runat="server" ID="phItems"></asp:PlaceHolder> 
      </LayoutTemplate> 
      <ItemTemplate> 
       <p> 
        Title: 
        <%#XPath("TITLE/text()")%></p> 
       <p> 
        <%#XPath("BOOKCODE/text()")%></p> 
      </ItemTemplate> 
      <EmptyDataTemplate> 
       <p> 
        Sorry no books available</p> 
      </EmptyDataTemplate> 
     </asp:ListView> 
    </ItemTemplate> 
</asp:Repeater> 
+0

यह बिल्कुल सही है जो मुझे लगता है ...हालांकि, "onItemDataBond" सहित मुझे नहीं लगता कि मेरे पास कोई ग्राहक नहीं दिखने का कोई तरीका है यदि उनके पास कोई उत्पाद नहीं है (जो कि यह अजीब लगता है, संभव है) – Tom

+1

ठीक है, आप हमेशा पुनरावर्तक को प्रतिस्थापित कर सकते हैं इसके बजाय सूचीदृश्य नियंत्रण के लिए, चूंकि सूचीदृश्य को EmptyDataTemplate की तरह मिल गया है जो स्वचालित रूप से प्रदर्शित होगा यदि आपके पास उस उपयोगकर्ता के लिए कोई डेटा नहीं है, तो जल्दी से एक उदाहरण जोड़ देगा – cstruter

0

कस्टम कोड के बजाय XmlDatasource का उपयोग करें, बेहतर परीक्षण, tweaked, अनुकूलित, और अपनी आवश्यकताओं को पूरा करता है। कुछ ऐसा क्यों लिखें जो ढांचे में पहले से ही है? ;)

<asp:xmldatasource 
    CacheDuration="Infinite" 
    id="XmlDataSource1" 
    runat="server" 
    XPath="Bookings/Booking[@CLIENT_NO='SA33762']" //<-- test this 
    datafile="~/myxml/bookstore.xml" /> 
+0

... अच्छा लग रहा है एक पूर्ण नौसिखिया तो यह उतना आसान नहीं हो सकता है! हालांकि टिप के लिए धन्यवाद। – Tom

+1

चूंकि आप एक पूर्ण नौसिखिया हैं, इसलिए मैं आपको अपने कोड केआईएसएस को प्रोत्साहित करता हूं (इसे छोटा और सरल रखें) पहियों को फिर से शुरू न करें; –

+0

मैं देखता हूं कि आपका क्या मतलब है, लेकिन मुझे पता है कि एक बात यह है कि मैं कोड के पीछे कोड का उपयोग नहीं कर रहा हूं, आप संकलित नहीं होने वाली किसी चीज के साथ खत्म हो जाएंगे - सर्वोत्तम अभ्यास नहीं और मैं इसे सबसे अच्छा तरीका करना सीखूंगा सबसे आसान से। – Tom

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