SettingsProviderの作成


My.Settingsでは格納変数のスコープとして、ユーザー単位又はアプリケーション単位の2種類がある。

ユーザー単位の特徴

  1. 1 プロラムからデータの読取り及び書込みが行える
  2. 2

アプリケーション単位の特徴




ユーザー ユーザ単位でデータを保管し、プログラムからデータの読取り及び書込み行える
アプリケーション アプリケーション単位でデータを保管し、プログラムからは読取りのみ行えるで値を保存することは出来ない

Imports System.Configuration
Imports System.Xml

Public Class LocalXMLSettingsProvider
   Inherits SettingsProvider

   ''' <summary>
   ''' 実行中のアプリケーション名
   ''' </summary>
   ''' <remarks></remarks>
   Private gApplicationName As String

   ''' <summary>
   ''' プロバイダ名
   ''' </summary>
   ''' <remarks></remarks>
   Private Const gProviderName As String = "LocalXMLSettingProvider"

   ''' <summary>
   ''' データ格納ファイル
   ''' </summary>
   ''' <remarks></remarks>
   Private gSettingsFileName As String

   Private gXMLSettingsNode As String


   ''' <summary>
   ''' コンストラクタ
   ''' </summary>
   Public Sub New()
       Me.gApplicationName = String.Empty

       gSettingsFileName = Me.GetType.Assembly.Location & ".XMLConfig"


   End Sub

   Public Overrides Sub Initialize(ByVal pname As String, _
       ByVal config As System.Collections.Specialized.NameValueCollection)
       '設定プロバイダ名を指定する
       MyBase.Initialize(gProviderName, config)

       gXMLSettingsNode = My.Settings.ToString
   End Sub


   ''' <summary>
   ''' 現在実行中のアプリケーション名
   ''' </summary>
   ''' <value></value>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Public Overrides Property ApplicationName() As String
       Get
           Return gApplicationName
       End Get
       Set(ByVal value As String)
           gApplicationName = value
       End Set
   End Property

   ''' <summary>
   ''' 
   ''' </summary>
   ''' <param name="context"></param>
   ''' <param name="collection"></param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Public Overrides Function GetPropertyValues( _
                               ByVal context As System.Configuration.SettingsContext, _
                               ByVal collection As System.Configuration.SettingsPropertyCollection) As System.Configuration.SettingsPropertyValueCollection

       Dim colSettingsValues As New SettingsPropertyValueCollection()

       ' XMLファイル読み込み準備
       Dim xmlPathDom As XPath.XPathDocument = New XPath.XPathDocument(gSettingsFileName)
       Dim xmlPathNavi As XPath.XPathNavigator = xmlPathDom.CreateNavigator()
       Dim xmlPathNode As XPath.XPathNodeIterator





       For Each settingsPropery As SettingsProperty In collection

           ' SettingPropertyValueを取得する
           Dim settingsValue As SettingsPropertyValue = New SettingsPropertyValue(settingsPropery)

           ' XMLファイルからデータを検索する
           xmlPathNode = DirectCast(xmlPathNavi.Evaluate(String.Format("//Settings/{0}/setting[@name='{1}']", gXMLSettingsNode, settingsPropery.Name)), XPath.XPathNodeIterator)
           If xmlPathNode.Count > 0 Then
               xmlPathNode.MoveNext()
               settingsValue.SerializedValue = xmlPathNode.Current.Value
           End If

           settingsValue.IsDirty = False
           colSettingsValues.Add(settingsValue)
       Next

       Return colSettingsValues
   End Function


   ''' <summary>
   ''' 
   ''' </summary>
   ''' <param name="context"></param>
   ''' <param name="collection"></param>
   ''' <remarks></remarks>
   Public Overrides Sub SetPropertyValues( _
                               ByVal context As System.Configuration.SettingsContext, _
                               ByVal collection As System.Configuration.SettingsPropertyValueCollection)

       Dim xmlsettings As XmlWriterSettings = New XmlWriterSettings()
       Dim xmlWriter As XmlWriter

       xmlsettings.Indent = True
       xmlsettings.IndentChars = "    "
       xmlWriter = xmlWriter.Create(gSettingsFileName, xmlsettings)
       xmlWriter.WriteStartElement("Settings")
       xmlWriter.WriteStartElement(gXMLSettingsNode)

       For Each settingsValue As SettingsPropertyValue In collection

           xmlWriter.WriteStartElement("setting")
           xmlWriter.WriteAttributeString("name", settingsValue.Name)
           If settingsValue.SerializedValue Is Nothing Then
               xmlWriter.WriteAttributeString("serializeAs", settingsValue.PropertyValue.GetType.Name)
               xmlWriter.WriteStartElement("value")
               xmlWriter.WriteValue(settingsValue.PropertyValue.ToString)
               xmlWriter.WriteEndElement()
           Else
               xmlWriter.WriteAttributeString("serializeAs", settingsValue.SerializedValue.GetType.Name)
               xmlWriter.WriteStartElement("value")
               xmlWriter.WriteValue(settingsValue.SerializedValue)
               xmlWriter.WriteEndElement()
           End If

           xmlWriter.WriteEndElement()

           settingsValue.IsDirty = False
       Next

       xmlWriter.WriteEndElement()
       xmlWriter.WriteEndElement()

       xmlWriter.Flush()
   End Sub
End Class
最終更新:2008年08月16日 22:16