2011-05-05 4 views
9

안녕 나는 마스터 xmlfile에서 가져온 열 (coursecode)이있는 데이터베이스가 있습니다. coursecode와 함께 데이터베이스는 시작 날짜, 종료 날짜 등과 같은 다른 데이터를 저장합니다.이 데이터를 정기적으로 업데이트해야 데이터베이스에 바인딩 된 gridview를 사용할 수 있습니다. 문제는 코스 이름이 xml 파일에만 있다는 것입니다. 관계형 데이터베이스의 테이블을 사용하여 데이터베이스와 XML 파일을 연결하여이 데이터를 GridView에 렌더링 할 수있는 방법이 있습니까? 나는 가졌지 만 결과 페이지가 매우 느려서 그렇게 할 수 없다고 가정합니다. 이 일을 할 수 있습니까?데이터베이스 바인딩 된 gridview에서 xml 파일의 값 가져 오기

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

XML이 포함 된 열의 SQL 데이터 형식은 무엇입니까? –

답변

0

사용이 DataTable을 당신의 SQL 소스에 대한 하나의 SQL 소스에 대해 다른 MARS (Multiple Active Result Sets) 속성을 연결시 true로 설정합니다. ~. codekey하고 namevalue입니다 각각의 데이터 테이블 세포

희망 바인드 그리드 뷰 열이는 Dictionary<string,string>으로 XML을 구문 분석하는 것입니다

1

좋은 방법을 작동합니다. 이제 CourseCode를 사용하여 CourseName을 가져 오는 작은 GridView 도우미 함수를 작성할 수 있습니다.

다음은 작동하는 예제입니다.

마크 업.

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

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 

코드 숨김도 System.Xml.Linq 가져 오기해야 할 수도 있습니다.

희망이 도움이됩니다.