xml形式で保存した掲示をXSLTを使って入力画面の下に表示する。
このとき、削除機能を追加するためのボタンを設けるが
asp.net内で処理できないため、同じ名前でasp.netで削除ボタンを追加する。
追加したボタンは、display:noneで表示しないようにした。
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="bbs.aspx.vb" Inherits="WebApplication1.bbs" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>みんなの掲示板</title>
<link rel="Stylesheet" type="text/css" href="main.css" />
<style type="text/css">
.style1
{
width: 115px;
}
.hidden
{
display:none;
</style>
</head>
<body>
<h1>みんなの掲示板</h1>
<form id="form1" runat="server">
<div>
<table id="content" >
<tr>
<td class="style1">
名前</td>
<td>
<asp:TextBox ID="Name" runat="server" Width="307px"></asp:TextBox>
</td>
</tr>
<tr>
<td class="style1">
題名</td>
<td>
<asp:TextBox ID="Subject" runat="server" Width="466px"></asp:TextBox>
</td>
</tr>
<tr>
<td class="style1">
本文</td>
<td>
<asp:TextBox ID="Body" runat="server" Height="105px" TextMode="MultiLine"
Width="465px"></asp:TextBox>
</td>
</tr>
<tr>
<td class="style1">
</td>
<td>
削除キー<asp:TextBox ID="Password" runat="server" TextMode="Password"></asp:TextBox>
<asp:Button ID="Submit" runat="server" Text="投稿" Width="67px" />
<input id="Reset1" type="reset" value="リセット" /></td>
</tr>
</table>
<asp:Xml ID="Xml1" runat="server" DocumentSource="~/xmlfile.xml"
TransformSource="~/xsltfile.xslt"></asp:Xml>
</div>
</form>
</body>
</html>
Imports System.Xml
Imports System.Xml.Xsl
Imports System.IO
Partial Public Class bbs
Inherits System.Web.UI.Page
Private xmlFilePath As String
Private xmlDoc As XmlDocument
Private xmlRoot As XmlElement
Private xmlEle As XmlElement
Private xmlNode As XmlElement
Private xmlText As XmlText
Protected WithEvents Del As Global.System.Web.UI.WebControls.Button
Private Sub bbs_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
End Sub
Protected Sub Delt_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Del.Click
Dim obj As Button
obj = CType(sender, Button)
Name.Text = obj.Text
Body.Text = Password.Text
Dim a As String
a = Request("password" & obj.Text)
Subject.Text = Val(a)
End Sub
Protected Sub Submit_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Submit.Click
' nodeの作成
xmlNode = xmlDoc.CreateElement("node")
' nodeに追加
Append("name", Name.Text)
Append("subject", Subject.Text)
Append("body", Body.Text)
Append("password", Password.Text)
Append("date", Now)
'id +1
Dim nodes As XmlNodeList
Dim n As Integer
nodes = xmlDoc.DocumentElement.SelectNodes("//id")
n = nodes.Count
If n = 0 Then
n = 1
Else
n = Val(nodes.Item(n - 1).InnerText) + 1
End If
Append("id", n)
'rootに追加
xmlRoot.AppendChild(xmlNode)
'保存
xmlDoc.Save(xmlFilePath)
'XSLTによる表示
Dim xslt As XslCompiledTransform = New XslCompiledTransform
xslt.Load(Page.Server.MapPath("xsltfile.xslt"))
End Sub
Private Sub Append(ByVal Tag As String, ByVal Param As String)
' <tag>題名</tag>
xmlText = xmlDoc.CreateTextNode(Param)
xmlEle = xmlDoc.CreateElement(Tag)
xmlEle.AppendChild(xmlText)
' nodeにtagを追加
xmlNode.AppendChild(xmlEle)
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
' Web.Configからファイル名を取得
xmlFilePath = System.Configuration.ConfigurationManager.AppSettings("xmlfile")
' フルパスに変更 xmlfile.xml --> C:\Users\・・・\xmlfile.xml
xmlFilePath = Page.Server.MapPath(xmlFilePath)
xmlDoc = New XmlDocument
' FIleInfoは、ファイル情報を調べる
Dim fs As New System.IO.FileInfo(xmlFilePath)
If fs.Exists Then
'ファイルが存在する
xmlDoc.Load(xmlFilePath)
Else
'ファイルが存在しない
xmlDoc.LoadXml("<?xml version=""1.0"" encoding=""utf-8"" ?><root/>")
End If
xmlRoot = xmlDoc.DocumentElement
'保存
xmlDoc.Save(xmlFilePath)
'削除ボタン生成とボタンの非表示処理
Dim nodes As XmlNodeList
Dim n As Integer
nodes = xmlDoc.DocumentElement.SelectNodes("//id")
n = nodes.Count
If n > 0 Then
n = Val(nodes.Item(n - 1).InnerText)
For i As Integer = 1 To n
Del = New Button
Del.ID = "delete" & i
Del.Text = i
Del.CssClass = "hidden"
AddHandler Del.Click, AddressOf Delt_Click
form1.Controls.Add(Del)
Next
End If
End Sub
End Class
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/xhtml1/strict"
>
<xsl:output method="xml" />
<xsl:template match="/">
<xsl:for-each select="root/node">
<xsl:sort select="date" order="descending" />
<table class="message">
<tr>
<td>
<xsl:value-of select="name"/>
</td>
<td>
<xsl:value-of select="date"/>
</td>
</tr>
<tr>
<td colspan="2">
<xsl:value-of select="subject"/>
</td>
</tr>
<tr>
<td colspan="2">
<xsl:value-of select="body"/>
</td>
</tr>
<tr>
<td colspan="2">
<xsl:element name="input">
<xsl:attribute name="type">password</xsl:attribute>
<xsl:attribute name="name">password<xsl:value-of select="id"/></xsl:attribute>
</xsl:element>
<xsl:element name="input">
<xsl:attribute name="type">submit</xsl:attribute>
<xsl:attribute name="name">delete<xsl:value-of select="id"/></xsl:attribute>
<xsl:attribute name="value">削除</xsl:attribute>
</xsl:element>
</td>
</tr>
</table>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>