DOBON.NET DOBON.NETプログラミング掲示板過去ログ

My.Settings で半角スペースを保存すると

環境/言語:[Windows7 64bit VB.NET Framework2.0]
分類:[.NET]

My.Settings で一個の半角スペースの文字列を保存すると、
改行記号と16個のスペースに変換して保存されるようです。
簡単な対処方法はありますか。
■No32867に返信(o.sさんの記事)
> My.Settings で一個の半角スペースの文字列を保存すると、
> 改行記号と16個のスペースに変換して保存されるようです。

項目値が「 」(半角スペース1個)の場合、config 内の設定が、

    <userSettings>
        <WindowsApplication1.My.MySettings>
            <setting name="何某" serializeAs="String">
                <value>
                </value>
            </setting>
        </WindowsApplication1.My.MySettings>
    </userSettings>

になってしまっているのだと推察します。


> 簡単な対処方法はありますか。

==================================
(案1) Visual Studio の設定画面は用いず、.config を直接編集する。

 長所:既存のコードに影響を与えない。
 短所:Visual Studio の設定画面を開くと、編集前の状態に戻ってしまう。


==================================
(案2) BASE64 文字列を格納するようにする。

 '読み取り
 TextBox1.Text = Encoding.UTF8.GetString(Convert.FromBase64String(My.Settings.何某))

 '編集
 My.Settings.何某 = Convert.ToBase64String(Encoding.UTF8.GetBytes(TextBox2.Text))
 My.Settings.Save()

 長所:.config 側で前後に空白が付与されても、問題なく復元できる。
 短所:既存のコードに修正が必要となる。

==================================
(案3) データ型を String 以外の型にする。(Type="System.Char" 案)
 『My.Settings.何某 の型を As String から As Char に変更』

 長所:config ファイルの可読性が維持できる。
 短所:「一文字」しか管理できない。(2文字以上や文字数0の保持には向かない)

==================================
(案4) データ型を String 以外の型にする。(Type="System.Char[]" 案)
 『My.Settings.何某 の型を As String から As Char() に変更』

 長所:既存のコードへの影響が少ない。
 長所:Visual Studio の設定画面を開きなおしても、編集結果が崩れることは無い。
 短所:config ファイルの可読性が悪化する。

 VB は、Char 配列と String をほぼ同等に扱えるようになっているため、
 設定情報を Char の一次元配列型に変更しておけば、
  '読み取り
  TextBox1.Text = My.Settings.何某
 や
  '編集
  My.Settings.VS2008 = TextBox1.Text
  My.Settings.Save()
 などといったコードは、そのまま無加工で扱えます。
 ただし、.config 側の保持形式は <ArrayOfChar> に変更されます。

==================================
スペースだけの文字列が正しく保存されないので、
ダミー文字を付加して保存することにしました。
読み出し時にはダミー文字を除去するようにします。

Settings.vb を以下のようにしました。

Namespace My

'このクラスでは設定クラスでの特定のイベントを処理することができます:
' SettingsLoaded イベントは、設定値が読み込まれた後に発生します。
' SettingsSaving イベントは、設定値が保存される前に発生します。

Partial Friend NotInheritable Class MySettings

Private Sub MySettings_SettingsSaving( _
ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles Me.SettingsSaving

末尾文字付加("設定名A")

End Sub

Private Sub MySettings_SettingsLoaded( _
ByVal sender As Object, _
ByVal e As System.Configuration.SettingsLoadedEventArgs) _
Handles Me.SettingsLoaded

末尾文字除去("設定名A")

End Sub

Private Sub 末尾文字付加(設定名 As String)
Me(設定名) = Me(設定名) & ";" 'ダミー文字を付加して保存
End Sub

Private Sub 末尾文字除去(設定名 As String)
Dim s As String = Me(設定名)
If s <> "" Then Me(設定名) = s.Substring(0, s.Length - 1)
End Sub

End Class

End Namespace
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板