1

これは前回の投稿からの続きです。送信フォームでテキスト ボックス コントロールと共に Gridview を使用しています。送信ボタンをクリックすると、情報が xml ファイルにレンダリングされます。フォームが使用されるたびに、xml ファイルに新しく入力されたデータが入力されるようにすることで、以前の送信から入力されたデータを上書きします。ユーザーは複数の製品番号を入力できる必要があります。これが、送信フォームで編集可能な Gridview を使用する理由です。私の問題は、送信ボタンをクリックすると、テキスト ボックスから入力されたデータが 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>

これは私のコード ビハインドです。これは、グリッドから 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 ファイルへの再書き込みに失敗します。ここで私が間違っていることについての方向性を教えてください。私は私が近いことを記入します。再度、感謝します。

4

1 に答える 1

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
于 2013-08-18T17:44:48.420 に答える