2011-05-05 14 views
9

Hola Tengo una base de datos con una columna (código de curso) que se toma de un xmlfile maestro. Junto con el código de curso, la base de datos almacena algunos otros datos, como fecha de inicio, fecha de finalización, etc. Necesito actualizar estos datos regularmente, así que uso una vista de cuadrícula que está vinculada a la base de datos. El problema es que el nombre del curso está solo en el archivo xml. ¿Hay alguna manera de vincular la base de datos y el archivo xml (como se hace con tablas en bases de datos relacionales) para representar estos datos en la vista de cuadrícula? He probado pero la página resultante es muy lenta, así que supongo que no se puede hacer de esa manera. ¿Se puede hacer esto?obtener el valor del archivo xml en gridview enlazado a la base de datos

courses.aspx

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ myconn %>" 
    SelectCommand="SELECT CourseCode, Data1, Data2, CourseType FROM Courses ORDER BY CourseCode"> 
    </asp:SqlDataSource> 

     <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="CourseCode" DataSourceID="SqlDataSource1"> 
    <Columns> 
     <asp:TemplateField HeaderText="CourseCode" SortExpression="CourseCode"> 

      <ItemTemplate> 
       <asp:Label ID="Label4" runat="server" Text='<%# Bind("CourseCode") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 

      <asp:TemplateField HeaderText="Name"> 
     <ItemTemplate> 
     <asp:Label id="lblDate" runat="server"></asp:Label> 
     </ItemTemplate> 
     </asp:TemplateField> 

     restofgridviewhere 

     </Columns> 
     </asp:GridView> 

courses.aspx.vb

 Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound 
    For i As Integer = 0 To GridView1.Rows.Count - 1 
     'create new label with the contents of lblDate 
     Dim labelDate As Label = DirectCast(GridView1.Rows(i).FindControl("lblDate"), Label) 
     Dim Label4 As Label = DirectCast(GridView1.Rows(i).FindControl("Label4"), Label) 

     For i As Integer = 0 To GridView1.Rows.Count - 1 
     Dim labelDate As Label = DirectCast(GridView1.Rows(i).FindControl("lblDate"), Label) 
     Dim Label4 As Label = DirectCast(GridView1.Rows(i).FindControl("Label4"), Label) 

     Dim ds As New DataSet() 
     ds.ReadXml("file.xml") 
     Dim xmlDoc As New XmlDataDocument(ds) 

     Dim nodeList As XmlNodeList = xmlDoc.DocumentElement.SelectNodes("courses/course[code = '" & Label4.Text & "']") 

     Dim myRow As DataRow 
     For Each myNode As XmlNode In nodeList 
      myRow = xmlDoc.GetRowFromElement(DirectCast(myNode, XmlElement)) 
      If myRow IsNot Nothing Then 
       labelDate.Text = myRow("name") 
      End If 
     Next 
     Next 
     End Sub 

file.xml

<courses> 
    <course> 
     <name>Course name</name> 
     <code>Course code</code> 
    </course> 
    <courses> 
+0

¿Cuál es el tipo de datos SQL de la columna con el XML? –

Respuesta

0

uso de dos tabla de datos uno para su fuente de SQL y otras de origen de SQL establece la propiedad Conjuntos múltiples de resultados activos (MARS) verdadera en conexión s tring. se unen a la vista en cuadrícula con columnas respectivas células DataTable

esperanza que esto funcionará

1

Un buen enfoque será el de analizar el código XML en un Dictionary<string,string> donde code es el keyname y es el value. Ahora puede escribir una pequeña función auxiliar GridView para obtener el CourseName utilizando CourseCode.

Aquí hay un ejemplo de trabajo.

The Markup.

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ApplicationServices %>" 
    SelectCommand="SELECT CourseCode, Data1, Data2, CourseType FROM Courses ORDER BY CourseCode"> 
</asp:SqlDataSource> 
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="CourseCode" 
    DataSourceID="SqlDataSource1"> 
    <Columns> 
     <asp:TemplateField HeaderText="Course Code" SortExpression="CourseCode"> 
      <ItemTemplate> 
       <asp:Label ID="CourseCodeLabel" runat="server" Text='<%# Eval("CourseCode") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Course Name"> 
      <ItemTemplate> 
       <asp:Label ID="CourseNameLabel" runat="server" Text='<%# GetCourseNameFromCode(Eval("CourseCode")) %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <%--restofgridviewhere--%> 
    </Columns> 
</asp:GridView> 

El código subyacente

Private Shared courseMapping As New Dictionary(Of String, String)() 

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load 

    If Not IsPostBack Then 
     'uri is the path to the xml 
     Dim uri As String = System.IO.Path.Combine(Server.MapPath("."), "App_Data/CourseXML.xml") 
     Dim courses As XElement = XElement.Load(uri) 
     For Each course As XElement In courses.Elements() 
      courseMapping.Add(course.Element("code").Value, course.Element("name").Value) 
     Next 
    End If 

End Sub 

Protected Function GetCourseNameFromCode(courseCode As Object) As String 
    Return courseMapping(courseCode.ToString()) 
End Function 

podría tener que importar System.Xml.Linq también.

Espero que esto ayude.

Cuestiones relacionadas