2013-08-17 2 views
1

데이터를 XML 파일로 렌더링하는 제출 양식 (텍스트 상자 & 드롭 다운 컨트롤)에 GridView (삽입/편집/삭제)를 사용하고 있습니다. GridView를 통해 XML 파일을 편집/삽입/삭제할 수 있으며 양식 컨트롤 태그도 제출 문제를 클릭하면 XML로 입력 된 데이터를 성공적으로 복사합니다. 내 문제는 제출 단추를 클릭하면 Gridview의 데이터가 지워져 양식 제어 태그에서 제출 된 데이터 만 남습니다. 를 통해 입력되는 데이터를 복사 잘Gridview ID를 XML WriteString 메서드에 전달하는 방법

Public Sub Write_XML(ByVal sender As System.Object, ByVal e As System.EventArgs) 
     Dim textWriter As New XmlTextWriter(Server.MapPath("xml/PersonDataVI.xml"), Nothing) 
     textWriter.Formatting = System.Xml.Formatting.Indented 
     'Start New Document 
     textWriter.WriteStartDocument() 
     'Write a Comment 
     textWriter.WriteComment("This is a comment") 
     'Insert Start Element -root element node 
     textWriter.WriteStartElement("PersonalData") 

     'write the child element 
     textWriter.WriteStartElement("products") 

     'write the child element 
     textWriter.WriteStartElement("product") 

     'save the data for the Grid 
     Dim productID As String = DirectCast(gvProductNumber.FooterRow.FindControl("txtProductIDInsert"), 

TextBox).Text 
     Dim productNumber As String = DirectCast(gvProductNumber.FooterRow.FindControl 

("txtProductNumberInsert"), TextBox).Text 
     BindGridView() 
     Dim dtXMLInsert As DataTable = DirectCast(gvProductNumber.DataSource, DataTable) 
     Dim dsgvProductNumber As New DataSet() 
     dsgvProductNumber.ReadXml(Server.MapPath("~/xml/PersonDataVI.xml")) 
     Dim drInsert As DataRow = dsgvProductNumber.Tables("product").NewRow() 
     drInsert("productID") = productID 
     drInsert("productNumber") = productNumber 
     Dim drParent As DataRow = dsgvProductNumber.Tables("products").Rows(0) 
     drInsert.SetParentRow(drParent) 
     dsgvProductNumber.Tables("product").Rows.Add(drInsert) 
     dsgvProductNumber.WriteXml(Server.MapPath("~/xml/PersonDataVI.xml")) 
     BindGridView() 

     textWriter.WriteEndElement() 
     textWriter.WriteEndElement() 

     'write the child element 
     textWriter.WriteStartElement("customers") 

     'write the child element 
     textWriter.WriteStartElement("customer") 

     'Write LastName Element and Data 
     textWriter.WriteStartElement("LastName", "") 
     textWriter.WriteString(txtLastName.Text) 
     textWriter.WriteEndElement() 

     'Write FirstName Element and Data 
     textWriter.WriteStartElement("FirstName", "") 
     textWriter.WriteString(txtFirstName.Text) 
     textWriter.WriteEndElement() 

     'Write Address Element and Data 
     textWriter.WriteStartElement("Address", "") 
     textWriter.WriteString(txtAddress.Text) 
     textWriter.WriteEndElement() 

     'Write City Element and Data 
     textWriter.WriteStartElement("City", "") 
     textWriter.WriteString(txtCity.Text) 
     textWriter.WriteEndElement() 

     'Write State Element and Data 
     textWriter.WriteStartElement("State", "") 
     textWriter.WriteString(txtState.Text) 
     textWriter.WriteEndElement() 

     'Write ZipCode Elment and Data 
     textWriter.WriteStartElement("ZipCode", "") 
     textWriter.WriteString(txtZipCode.Text) 
     textWriter.WriteEndElement() 

     'End Everything 
     textWriter.WriteEndDocument() 

     'Clean up 
     textWriter.Flush() 
     textWriter.Close() 

     'Display the XML Document 
     Response.Redirect(Server.MapPath("xml/PersonDataVI.xml")) 
    End Sub 

... 코드가 작동 : 다음

폼 컨트롤 태그를 통해 제출 된 데이터를 기록하기 위해 사용하고있는 코드 (버튼 이벤트 핸들러)입니다 폼 컨트롤 태그를 xml 파일에 추가하십시오. 내 질문은, 어떻게 DataView를 클릭하면 XML 파일 내에서 머물 Gridview에서 얻을 수 있습니다. 이전 게시물 (데이터 코드 저장에 대한 내 코드 스 니펫의 의견을 말하십시오)에서 새 dataTable을 추가하고 일부 열을 추가 한 다음 일부 데이터 행으로 채우고 단추 이벤트 핸들러에 추가했습니다. 그러나 이제는 "xml 파일이 다른 응용 프로그램에서 사용 중입니다."라는 오류가 나타납니다. 이제 내 xml 파일이 비어있게됩니다. 위에서 제공 한 스 니펫을 살펴보고 내가 잘못하고있는 것에 대해 몇 가지 지침을 제시해 주시겠습니까?

답변

0

여기에는 두 가지 문제가 있습니다. 1. xml을 저장할 때마다 이전 데이터가 손실되어 xml 파일을 덮어 쓰고 있습니다. 2. xmltextwriter로 xml 파일을 열고 저장 한 후 파일을 비우십시오. 일시 중지 후에도 파일을 열어 볼 수 있습니다. xdocument를 사용하는 것이 좋습니다. 이 게시물을 확인하십시오 : Writing XML to a file without overwriting previous data.

편집 : 당신은 다음과 같은 방법으로 원하는 결과를 얻을 수 있습니다 :

Public Sub Write_XML(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    'You have saved xml, now want to add data thorugh text boxes 

    Dim dsgvPersonalData As New DataSet() 
    dsgvPersonalData.ReadXml(Server.MapPath("~/xml/PersonDataVI.xml")) 

    'Add new Product 
    Dim drNewProduct As DataRow = dsgvPersonalData.Tables("products").NewRow() 
    Dim productID As String = DirectCast(gvProductNumber.FooterRow.FindControl("txtProductIDInsert"), TextBox).Text 
    Dim productNumber As String = DirectCast(gvProductNumber.FooterRow.FindControl("txtProductNumberInsert"), TextBox).Text 
    drNewProduct("productID") = productID 
    drNewProduct("productID") = productNumber 
    dsgvPersonalData.Tables("products").Rows.Add(drNewProduct) 

    'Add new Customer 
    Dim drNewCustomer As DataRow = dsgvPersonalData.Tables("customesr").NewRow() 
    drNewProduct("LastName") = txtLastName.Text 
    drNewProduct("FirstName") = txtFirstName.Text 
    drNewProduct("Address") = txtAddress.Text 
    drNewProduct("City") = txtCity.Text 
    drNewProduct("State") = txtState.Text 
    drNewProduct("ZipCode") = txtZipCode.Text 
    dsgvPersonalData.Tables("customerx").Rows.Add(drNewProduct) 

    'Save the xml 
    dsgvPersonalData.WriteXml(Server.MapPath("~/xml/PersonDataVI.xml")) 

    'databinding is easy here 
    gvProductNumber.DataSource = dsgvPersonalData.Tables("products") 
    gvProductNumber.DataBind() 
End Sub 
+0

내가 실제로 XML 파일이 새로운 데이터로 (버튼 클릭을 통해 제출) 양식/사용할 때마다 채우려. 제출 버튼을 클릭하면 XML 파일은 현재 텍스트 상자 컨트롤을 통해서만 입력 된 데이터로 채워집니다. 그리드 데이터를 유지하는 방법을 알아 내려고 노력 중입니다. 다시 말해 제출 버튼을 클릭하면 XML 데이터에 그리드 데이터를 다시 쓰십시오. 다른 제안? – user1724708

+0

... 계속 ... 제출 버튼을 클릭 할 때마다 텍스트 상자 컨트롤에서 제출 된 데이터와 함께 gridview의 데이터를 xml 파일에 다시 쓰고 싶습니다. 지금까지, gridview에서 데이터는 텍스트 상자 컨트롤에서 제출 된 데이터로 덮어 씁니다. – user1724708

+0

제 이해는 루트, 제품 및 고객에 두 개의 하위 노드가 있음을 의미합니다. Products 노드는 GridView에 연결됩니다. 이제 새 제품을 텍스트 상자에 추가하고이 데이터로 표를 업데이트하려고합니다. 고객도 추가하고 있지만 gridview에 바인딩하지는 마십시오. 나 맞아? – afzalulh

관련 문제