这是我上一篇文章的延续,我在提交表单中使用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>
<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: <asp:TextBox id="txtLastName" runat="server" /></p></div>
<div><p>First Name: <asp:TextBox id="txtFirstName" runat="server" /></p></div>
<div><p>Street Address: <asp:TextBox id="txtAddress" runat="server" /></p></div>
<div><p>City: <asp:TextBox id="txtCity" runat="server" /></p></div>
<div><p>State: <asp:TextBox id="txtState" runat="server" /></p></div>
<div><p>Zip Code: <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文件; 拜托,我能不能指出我在这里做错了什么。我说我很接近。再次感谢。
答案 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