目前我正在开发一种使用Visual Studio 2008和C#的分层架构的软件。 在那个系统中,我想在XML文件中保留所有文本消息(必要时使用消息框显示),这样如果我更新任何消息,我就不必编译整个系统。我怎么能做到这一点?什么是XML文件结构?如何从C#代码调用消息?请描述并举例说明。 感谢。
答案 0 :(得分:1)
您的方案的更好选择可能是资源附属DLL。这是一个单独的DLL,其中包含一组动态加载到应用程序中的资源。这是多少不同的应用程序进行本地化。最重要的是,有许多工具支持这种功能。
更改消息只会涉及更改此DLL。这确实导致编译,但只导致资源而不是系统。
答案 1 :(得分:1)
我会创建一个使用.NET DataSet和DataTable来存储id和消息(以及你需要的任何其他内容)的类。
这样,类可以使用DataSet.WriteXML()和DataSet.ReadXML()从您指定的任何文件名中保存/加载,您不必担心自己“手工制作”XML格式。
这听起来像一个方便的课程,所以我写了一个作为“概念证明”:
'*************************************************************************
' Class: MsgFile
' Author: Ron Savage
' Date: 05/14/2009
'
' This class is an example for using an XML file to hold messages to be
' displayed by an application.
'
' Modification History
' Date Init Comment
' 05/14/2009 RS Created.
'*************************************************************************
Imports Microsoft.VisualBasic
Imports System.IO
Public Class MsgFile
'*************************************************************************
' Class Variables
'*************************************************************************
Private MsgFile As String
Private msgData As DataSet
Private msgTable As DataTable
'*************************************************************************
' Sub: New()
' Author: Ron Savage
' Date: 05/14/2009
'
' Creates a new MsgFile from an existing file, or creates an empty one
' with the specified file name.
'*************************************************************************
Sub New(ByVal msg_File As String)
Dim srcFile As New FileInfo(msg_File)
If (srcFile.Exists()) Then
msgData = New DataSet()
Load(msg_File)
Else
NewFile(msg_File)
End If
End Sub
'*************************************************************************
' Sub: NewFile()
' Author: Ron Savage
' Date: 05/14/2009
'
' Creates a new XML message file.
'*************************************************************************
Sub NewFile(ByVal msg_File As String)
Me.MsgFile = msg_File
If (IsNothing(msgData)) Then
msgData = New DataSet("MyAppMessages")
msgTable = New DataTable("Messages")
msgTable.Columns.Add(New DataColumn("Id", GetType(System.Int32), Nothing, MappingType.Attribute))
msgTable.Columns.Add(New DataColumn("Text", GetType(System.String), Nothing, MappingType.Attribute))
msgData.Tables.Add(msgTable)
setMessage(0, "New file created")
End If
Save()
End Sub
'*************************************************************************
' Sub: Load()
' Author: Ron Savage
' Date: 05/14/2009
'
' Loads an existing XML message file into the dataset.
'*************************************************************************
Public Sub Load(ByVal msgFileName As String)
Dim srcFile As FileInfo = Nothing
Me.MsgFile = msgFileName
srcFile = New FileInfo(msgFileName)
msgData.Clear()
If (srcFile.Exists()) Then
msgData.ReadXml(msgFileName)
msgTable = msgData.Tables("Messages")
End If
End Sub
'*************************************************************************
' Sub: Save()
' Author: Ron Savage
' Date: 10/05/2008
'
' This routine saves the DataSet to an XML file.
'*************************************************************************
Public Overridable Sub Save()
If (Not IsNothing(msgData) And Not MsgFile.Equals("")) Then
Dim fileWriter As StreamWriter = New StreamWriter(MsgFile)
msgData.WriteXml(fileWriter)
fileWriter.Close()
End If
End Sub
'*************************************************************************
' Sub: getMessage()
' Author: Ron Savage
' Date: 05/14/2009
'
' This gets the text of the message.
'*************************************************************************
Public Function getMessage(ByVal msgId As String) As String
Dim rowsFound() As System.Data.DataRow
Dim msgText As String = ""
If (Not IsNothing(msgTable)) Then
rowsFound = msgTable.Select("Id = " + msgId.ToString)
If (rowsFound.Length > 0) Then
msgText = rowsFound(0).Item("Text").ToString
End If
End If
Return (msgText)
End Function
'*************************************************************************
' Sub: setMessage()
' Author: Ron Savage
' Date: 05/14/2009
'
' This sets the text of the message.
'*************************************************************************
Public Sub setMessage(ByVal msgId As Integer, ByVal msgText As String)
Dim rowsFound() As System.Data.DataRow
Dim msgRow As System.Data.DataRow
If (Not IsNothing(msgTable)) Then
rowsFound = msgTable.Select("Id = " + msgId.ToString)
If (rowsFound.Length > 0) Then
msgRow = rowsFound(0)
msgRow.Item("Id") = msgId
msgRow.Item("Text") = msgText
Else
msgRow = msgTable.NewRow()
msgRow.Item("Id") = msgId
msgRow.Item("Text") = msgText
msgTable.Rows.Add(msgRow)
End If
End If
Save()
End Sub
End Class
答案 2 :(得分:0)
您可能希望将自己的自定义部分添加到app.config文件中以存储邮件。但是,每次邮件更改时,都需要您更新app.config文件。
http://msdn.microsoft.com/en-us/library/system.configuration.configurationsection.aspx