2011-01-26 5 views
5

Estoy tratando de colocar un repetidor dentro de un repetidor utilizando datos xml. Lo tengo trabajando exactamente como quiero, pero el método que he usado recarga los datos para cada repetidor. Creo que necesito lanzar como un XmlNode, pero voy a ser sincero, no tengo idea de por dónde empezar.Evite volver a cargar todos los datos XML para cada repetidor - vb.net

Aquí está mi código: si es posible, me gustaría mantener todo en el código.

<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> 

¿Alguna idea?

Respuesta

1

¿Falta algo aquí?

¿No puede simplemente comentar/eliminar su doc.Load (Server.MapPath ("~/myxml/bookstore.xml")) dentro de su elemento Sub D? ¿Desde que definió el documento "globalmente" y ya lo cargó en la carga de la página? (haciendo que ya se evitará volver a cargar el xml)

Dicho esto, estoy de acuerdo con Caspar que se debe más bien utilizar el XmlDataSource (sobre todo por su capacidad de almacenamiento en caché), usted no tiene que utilizar la XmlDataSource dentro de su margen de beneficio - siempre se puede definir dentro de su código subyacente, así - Puesto que usted está preocupado por las personas que ven su (del lado del servidor asp.net basados) marcado por alguna razón ...

p.ej

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 

de marcado: (Niza que notará aquí, es que nos atamos el segundo repetidor usando la fuente desde el primer repetidor)

<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

<?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> 

La implementación con el control ListView (uno de mis controles asp.net favoritos) se verá algo como esto: (Si no hay libros disponibles, se mostrará el marcado dentro del 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

Eso es casi perfecto, creo ...sin embargo, al no incluir un "onItemDataBond", no creo que tenga una forma de no mostrarle a un cliente si no tiene ningún producto (que aunque parezca extraño, es posible) – Tom

+1

Bueno, siempre puede sustituir al repetidor para el control listview en cambio, dado que la vista de lista tiene una EmptyDataTemplate que se mostrará automáticamente si no tiene ningún dato para ese usuario, agregará un ejemplo rápidamente – cstruter

0

Use un XmlDatasource en lugar de un código personalizado, mejor probado, ajustado, optimizado y que cumpla con sus requisitos. ¿Por qué escribir algo que ya está en el marco? ;)

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

suena muy bien ... Aunque estoy un poco de hacer la pregunta aquí porque soy ¡un principiante completo así que no podría ser tan fácil como eso! Gracias por el consejo. – Tom

+1

Como eres un novato completo, te animo a BESAR tu código (mantenlo corto y simple) No empieces a reinventar las ruedas; –

+0

Veo lo que quieres decir, pero una cosa que sí sé es que al no usar el código detrás del código, terminarás con algo que no está compilado, no es la mejor práctica y preferiría aprender a hacerlo de la mejor manera que el más fácil. – Tom

Cuestiones relacionadas