1

ファイル アップローダーのデータベースとして xml を使用しています。ファイルをアップロードしてxmlを生成しましたが、データベースへのすべてのエントリを一覧表示し、エントリを削除するオプションとエントリにイニシャルを追加するオプションをユーザーに提供する「管理」ページの作成に問題がありますしかし、それは私が助けを必要としているものではありません。を使用して XML を正しく表示しましたが、機能する削除ボタンを作成するには、<asp:GridView>.

gridView を使用して XML を表示することさえできません。削除ボタンの機能はあると思いますが、この問題のためにテストできません。どんな助けでも大歓迎です。

私のコード:

admin.aspx

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

        <asp:GridView ID="adminXML" runat="server"  />

    </div>
    </form>
</body>
</html>

resdat.xml

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<resdat>
  <entry>
    <date>SomeDate</date>
    <filename>someFile.jpg</filename>
    <filePath>http://google.com</filePath>
    <initials></initials>
  </entry>
  <entry>
    <date>11-11-2013</date>
    <filename>owl2.jpg</filename>
    <filePath>http://somewebsite.com/data/owl2.jpg</filePath>
    <initials></initials>
  </entry>
  <entry>
    <date>11-11-2013</date>
    <filename>wildtextures-old-paper-texture-3.jpg</filename>
    <filePath>http://somewebsite.com/data/wildtextures-old-paper-texture-3.jpg</filePath>
    <initials></initials>
  </entry>
  <entry>
    <date>11-11-2013</date>
    <filename>QwbRElE_.m4a</filename>
    <filePath>http://somewebsite.com/data/QwbRElE_.m4a</filePath>
    <initials></initials>
  </entry>
</resdat>

admin.aspx.cs

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Linq;
using System.Linq;

namespace fileUploader
{
    public partial class admin : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            XmlDataSource xmlDS = new XmlDataSource();
            xmlDS.EnableCaching = false;
            xmlDS.DataFile = "~/App_Data/resdat.xml";
            xmlDS.TransformFile = "~/App_Data/adminFormat.xslt";
            xmlDS.XPath = "/resdat";
            adminXML.DataSource = xmlDS;
            adminXML.DataBind();
            adminXML.Visible = true;



        }
        private void btn_Delete(object sender, EventArgs e)
        {
            //XmlDocument resdat = new XmlDocument();
            //resdat.Load("~/App_Data/resdat.xml");



            //    resdat.Save(Server.MapPath("~/App_Data/resdat.xml"));
        }

    }
}

adminFormat.xslt

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="html" indent="yes"/>
<!-- This is old code for the <asp:Xml> format -->
    <!--<xsl:template match="/resdat">
        <h3>Entries in XML Database</h3>
      <table>
        <thead>
          <tr>
            <td>Date</td>
            <td>File</td>
            <td>Initials</td>
            <td>Delete</td>
          </tr>
        </thead>
        <xsl:for-each select="entry">
          <tr>
            <td>
              <xsl:value-of select="date"/>
            </td>
            <td>
              <a>
                <xsl:attribute name="href">
                  <xsl:value-of select="filePath"/>
                </xsl:attribute>

                <xsl:value-of select="filename"/>
              </a>
            </td>
            <td>
              <xsl:value-of select="initials"/>
            </td>
            <td>
              <input type="button" value="delete" onClick="btn_Delete" >
                <xsl:attribute name="id">
                  <xsl:value-of select="filename"/>

                </xsl:attribute>

              </input>
            </td>

          </tr>



        </xsl:for-each>


      </table>
    </xsl:template>-->

  <xsl:template match="/">
    <resdat>
      <xsl:apply-templates/>
    </resdat>
  </xsl:template>


  <xsl:template match="entry">
    <entry>
      <xsl:apply-templates select="*"/>      
    </entry>   
  </xsl:template>

  <xsl:template match="resdat/entry/*">
    <xsl:attribute name="{local-name()}">
      <xsl:value-of select="."/>
    </xsl:attribute>



  </xsl:template>

</xsl:stylesheet>

私はネット全体を探し回ってきましたが、これまでのところ、私に役立つリソースを見つけることができませんでした. どんな助けでも大歓迎です。

tl:dr テーブル形式の各「エントリ」の横に削除ボタンが必要です。削除ボタンの適切な解決策が見つからないか、xml をデータグリッドに正しくロードできません。どんな助けでも感謝します。

4

1 に答える 1

1

あなたが抱えている問題の1つは、xpath式にあると思います

xmlDS.XPath = "/resdat";

これは、グリッドの「行」を選択するための xpath 式である必要があります。あなたの場合、すべてのエントリ要素の行が必要なので、次のようになります

xmlDS.XPath = "/resdat/entry";

実際、この場合、ルート要素の子要素がレコードであると想定されるため、この行をコメントアウトしても問題ありません。

[削除] ボタンの実行に関しては、XmlDataSource コントロールは読み取り専用のデータ ソースであるため、実際には編集可能な GridView を対象としていないことに注意してください。ただし、それをやり続けたい場合は、列を自動生成する代わりに手動で指定し、削除を行うボタン フィールドを指定する必要があります。

       <asp:GridView ID="adminXML" runat="server" AutoGenerateColumns="False" OnRowCommand="adminXML_RowCommand" >
        <Columns>
            <asp:BoundField HeaderText="File Name" DataField="filename" SortExpression="ProductID" />
            <asp:ButtonField CommandName="Del" Text="Delete" />
       </Columns>
       </asp:GridView>

次に、コード ビハインドには、行の削除を自分で処理するコードがあります。

    protected void adminXML_RowCommand(object sender, CommandEventArgs e)
    {
        if (e.CommandName == "Del")
        {
            /*
            Do Delete
            */
        }
    }

イベント引数eのプロパティを見ると、CommandArgument プロパティが削除する行の行インデックスに設定されていることがわかります。

覚えておくべきことの 1 つは、ページの読み込みごとにデータ バインドを実行していることです。この場合、ページが最初にアクセスされたときにのみ実行する必要があり、ポストバックでは実行する必要はありません。また、XML から行を自分で削除する必要があるため、削除後にグリッドを再バインドする必要があります。したがって、コードは次のようになります

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            BindDataSource();
            adminXML.Visible = true;
        }
    }

    protected void adminXML_RowCommand(object sender, CommandEventArgs e)
    {
        if (e.CommandName == "Del")
        {
            /*
            Do Delete
            */
            BindDataSource();
        }
    }

    private void BindDataSource()
    {
        XmlDataSource xmlDS = new XmlDataSource();
        xmlDS.EnableCaching = false;
        xmlDS.DataFile = "~/App_Data/resdat.xml";
        xmlDS.TransformFile = "~/App_Data/adminFormat.xslt";
        xmlDS.XPath = "/resdat/entry";
        adminXML.DataSource = xmlDS;
        adminXML.DataBind();
    }

もちろん、これを機能させるには、XML ドキュメントのアクセス許可を修正して、asp.net ユーザーが書き込みできるようにする必要があります。また、2 人のユーザーが同時に XML ドキュメントを修正しようとした場合にどうなるかも考慮する必要があります。

ただし、理想的には、編集可能なデータ ソースがある場合は、SQL データ ソース (Microsoft の SQL Compact など) の使用を検討する必要があります。

于 2013-11-11T23:07:07.987 に答える