如何在按钮单击时将Gridview数据重写为XML文件? ASP.Net VB

时间:2013-08-18 15:23:52

标签: asp.net xml vb.net

这是我上一篇文章的延续,我在提交表单中使用Gridview以及文本框控件。单击提交按钮后,信息将呈现为xml文件。每次使用表单时,我的意图是使用新输入的数据填充xml文件,从而覆盖从先前提交的数据中输入的数据。用户需要能够输入多个产品编号,这是我在提交表单中使用可编辑网格视图的原因。我的问题是,当单击提交按钮时,从文本框输入的数据将被复制到xml文件,但Gridview中的数据会被覆盖。但是,我可以通过Gridview编辑/插入/删除数据到XML文件。 gridview数据无法保存到xml文件:

以下是我的设计:

  <div>
    <!--Grdiview -->
    <div>
        <asp:GridView ID="gvProductNumber" runat="server" AutoGenerateColumns="False"
                        onrowdeleting="gvProductNumber_RowDeleting" onrowediting="gvProductNumber_RowEditing"
                        onrowupdating="gvProductNumber_RowUpdating" onrowcommand="gvProductNumber_RowCommand"
                        ShowFooter="True" Width="482px"
                        onrowcancelingedit="gvProductNumber_RowCancelingEdit">
                        <Columns>
                            <asp:TemplateField HeaderText="Product ID">
                                <EditItemTemplate>
                                    <asp:TextBox ID="txtProductID" runat="server" Text='<%# Bind("productID") %>'></asp:TextBox>
                                </EditItemTemplate>
                                <FooterTemplate>
                                    <asp:TextBox ID="txtProductIDInsert" runat="server"></asp:TextBox>
                                </FooterTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="lblProductID" runat="server" Text='<%# Bind("ProductID") %>'></asp:Label>
                                </ItemTemplate>
                            </asp:TemplateField>
                             <asp:TemplateField HeaderText="Product Number">
                                <EditItemTemplate>
                                    <asp:TextBox ID="txtProductNumber" runat="server" Text='<%# Bind("productNumber") %>'></asp:TextBox>
                                </EditItemTemplate>
                                <FooterTemplate>
                                    <asp:TextBox ID="txtProductNumberInsert" runat="server"></asp:TextBox>
                                </FooterTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="lblProductNumber" runat="server" Text='<%# Bind("ProductNumber") %>'></asp:Label>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField ShowHeader="False">
                                <EditItemTemplate>
                                    <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="True"
                                        CommandName="Update" Text="Update"></asp:LinkButton>
                                    &nbsp;<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False"
                                        CommandName="Cancel" Text="Cancel"></asp:LinkButton>
                                </EditItemTemplate>
                                <FooterTemplate>
                                    <asp:LinkButton ID="btnInsert" runat="server" CommandName="insertXMLData">Insert</asp:LinkButton>
                                </FooterTemplate>
                                <ItemTemplate>
                                    <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False"
                                        CommandName="Edit" Text="Edit"></asp:LinkButton>
                                </ItemTemplate>
                                <ItemStyle Width="120px" />
                            </asp:TemplateField>
                            <asp:CommandField ShowDeleteButton="True" />
                         </Columns>
                    </asp:GridView>   
    </div>
    <!--end gridview -->



           <br /><br />

           <div> 
            <div><p>Last Name:&nbsp; <asp:TextBox id="txtLastName" runat="server" /></p></div>
            <div><p>First Name:&nbsp; <asp:TextBox id="txtFirstName" runat="server" /></p></div>
            <div><p>Street Address:&nbsp; <asp:TextBox id="txtAddress" runat="server" /></p></div>
            <div><p>City:&nbsp; <asp:TextBox id="txtCity" runat="server" /></p></div>
            <div><p>State:&nbsp; <asp:TextBox id="txtState" runat="server" /></p></div>
            <div><p>Zip Code:&nbsp; <asp:TextBox id="txtZipCode" runat="server" /></p></div>
            <div><asp:Button id="btnWriteXml" OnClick="Write_XML" Text="Write XML File" runat="server" /></div>
          </div>
    </div>

这是我的代码背后,我正在尝试将数据从Grid重新写入xml文件,同时写入通过文本框控件输入的数据:

'将结果写入xml文件

   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("product").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("productNumber") = productNumber
        dsgvPersonalData.Tables("product").Rows.Add(drNewProduct)

        'Add new Customer
        Dim drNewCustomer As DataRow = dsgvPersonalData.Tables("customer").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("customer").Rows.Add(drNewProduct)

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

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

我试图生成的xml:

  <PersonalData>
  <products>
    <product>
      <productID>1</productID>
      <productNumber>123456</productNumber>
    </product>
    <product>
      <productID>2</productID>
      <productNumber>458922</productNumber>
    </product>
    <product>
      <productID>4</productID>
      <productNumber>224578</productNumber>
    </product>
    <product>
      <productID>5</productID>
      <productNumber>789012</productNumber>
    </product>
  </products>
  <customers>
    <customer>
      <LastName>Doe</LastName>
      <FirstName>Jane</FirstName>
      <Address>1456 somewhere Dr.</Address>
      <City>Frisco</City>
      <State>California</State>
      <ZipCode>59045</ZipCode>
    </customer>
  </customers>
</PersonalData>

如前所述,gridiview中的xml无法在按钮单击时重新写入xml文件; 拜托,我能不能指出我在这里做错了什么。我说我很接近。再次感谢。

1 个答案:

答案 0 :(得分:0)

你正在重复逻辑。

编辑:以下代码应该有效。

Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Data
Imports System.Xml



Public Class Default6_gridview
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
            BindGridView()
        End If
    End Sub
    'Bind Data
    Protected Sub BindGridView()
        Dim dsgvProductNumber As New DataSet()
        dsgvProductNumber.ReadXml(Server.MapPath("~/xml/PersonDataVI.xml"))
        gvProductNumber.DataSource = dsgvProductNumber.Tables("product")
        gvProductNumber.DataBind()
        gvProductNumber.ShowFooter = True
    End Sub
    'Delete
    Protected Sub gvProductNumber_RowDeleting(ByVal sender As Object, ByVal e As GridViewDeleteEventArgs)
        BindGridView()
        Dim dsgvProductNumber As New DataSet()
        dsgvProductNumber.ReadXml(Server.MapPath("~/xml/PersonDataVI.xml"))
        dsgvProductNumber.Tables("product").Rows(gvProductNumber.Rows(e.RowIndex).DataItemIndex).Delete()
        dsgvProductNumber.WriteXml(Server.MapPath("~/xml/PersonDataVI.xml"))
        BindGridView()
    End Sub
    'Row edit
    Protected Sub gvProductNumber_RowEditing(ByVal sender As Object, ByVal e As GridViewEditEventArgs)
        gvProductNumber.ShowFooter = False
        gvProductNumber.EditIndex = e.NewEditIndex
        BindGridView()
    End Sub
    'Update GridView
    Protected Sub gvProductNumber_RowUpdating(ByVal sender As Object, ByVal e As GridViewUpdateEventArgs)
        Dim index As Integer = gvProductNumber.Rows(e.RowIndex).DataItemIndex
        Dim productId As String = DirectCast(gvProductNumber.Rows(e.RowIndex).FindControl("txtProductID"), TextBox).Text
        Dim productNumber As String = DirectCast(gvProductNumber.Rows(e.RowIndex).FindControl("txtProductNumber"), TextBox).Text
        gvProductNumber.EditIndex = -1
        BindGridView()

        Dim dsgvProductNumber As New DataSet()
        dsgvProductNumber.ReadXml(Server.MapPath("~/xml/PersonDataVI.xml"))
        dsgvProductNumber.Tables("product").Rows(index)("productID") = productId
        dsgvProductNumber.Tables("product").Rows(index)("productNumber") = productNumber
        dsgvProductNumber.WriteXml(Server.MapPath("~/xml/PersonDataVI.xml"))
        BindGridView()
    End Sub
    'Cancel
    Protected Sub gvProductNumber_RowCancelingEdit(ByVal sender As Object, ByVal e As GridViewCancelEditEventArgs)
        gvProductNumber.EditIndex = -1
        BindGridView()
    End Sub
    'Insert New Row
    Protected Sub gvProductNumber_RowCommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs)
        If e.CommandName = "insertXMLData" Then
            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("product").Rows(0)
            drInsert.SetParentRow(drParent)
            dsgvProductNumber.Tables("product").Rows.Add(drInsert)
            dsgvProductNumber.WriteXml(Server.MapPath("~/xml/PersonDataVI.xml"))

            BindGridView()
        End If

    End Sub
    'Write the results to the xml file
    '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")
    '    'Write ProductID Element and Data
    '    textWriter.WriteStartElement("productID", "")
    '    textWriter.WriteString(txtProductID.Text)
    '    textWriter.WriteEndElement()
    '    'Write ProductNumber Element and Data
    '    textWriter.WriteStartElement("productNumber", "")
    '    textWriter.WriteString(txtProductNum.Text)
    '    textWriter.WriteEndElement()

    '    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"))

    '    '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("product").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("productNumber") = productNumber

    '    'add in the parent
    '    'Dim drParentTbl As DataRow = dsgvPersonalData.Tables("product").Rows(0)
    '    'drNewProduct.SetParentRow(drParentTbl)

    '    dsgvPersonalData.Tables("product").Rows.Add(drNewProduct)

    '    'Add new Customer
    '    Dim drNewCustomer As DataRow = dsgvPersonalData.Tables("customers").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("customers").Rows.Add(drNewProduct)

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

    '    'databinding is easy here
    '    gvProductNumber.DataSource = dsgvPersonalData.Tables("product")
    '    gvProductNumber.DataBind()

    'End Sub

    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("product").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("productNumber") = productNumber
        dsgvPersonalData.Tables("product").Rows.Add(drNewProduct)

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

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

        'databinding is easy here
        gvProductNumber.DataSource = dsgvPersonalData.Tables("product")
        gvProductNumber.DataBind()
    End Sub
End Class