星期二, 11月 10, 2020

[C#] 設定檔 - Settings.settings

設定檔 - Settings.settings 可以用來儲存應用程式所需的參數,例如公司名稱、專案名稱、使用者、使用者喜好設定等,避免 Hard Code,增加應用彈性

在 Project Properties 內可以找到 Setting.settings 檔案
 
[C#] 應用程式設定檔 - Settings.settngs-1

點擊 Setting.settings 可以開啟 [設定] 頁面,分別輸入 Title、BGColor、LocationX、LocationY 和 BindingText 這 5 個設定值,各設定值用途
  • Title:Form.Text 使用
  • BGColor:使用者挑選顏色,並在 PictureBox 內顯示
  • LocationX 和 LocationY:紀錄 Form 最後的位置
  • BindingText:直接綁定 TextBox.Text Property

範圍有應用程式 (Application) 和使用者 (User) 兩種
  • 應用程式:唯讀,無法進行修改,設定值會存放在 App.Config 內的 <applicationSettings> 區段
  • 使用者:可讀寫,設定值會存放在 App.config 內的 <userSettings> 區段

  [C#] 應用程式設定檔 - Settings.settngs-2

設定完成後,可以在 app.Config 內看見相關設定
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="ConfigSample.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="ConfigSample.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
    <userSettings>
        <ConfigSample.Properties.Settings>
            <setting name="BGColor" serializeAs="String">
                <value />
            </setting>
            <setting name="LocationX" serializeAs="String">
                <value>0</value>
            </setting>
            <setting name="LocationY" serializeAs="String">
                <value>0</value>
            </setting>
            <setting name="BindingText" serializeAs="String">
                <value>控件綁定</value>
            </setting>
        </ConfigSample.Properties.Settings>
    </userSettings>
    <applicationSettings>
        <ConfigSample.Properties.Settings>
            <setting name="Title" serializeAs="String">
                <value>[C#] 應用程式設定檔 - Settings.settngs</value>
            </setting>
        </ConfigSample.Properties.Settings>
    </applicationSettings>
</configuration>
C# Code 來進行讀取、設定和儲存
  • Load Event:載入設定值
  • FormClosing Event:儲存設定值
using System;
using System.Drawing;
using System.Windows.Forms;

namespace ConfigSample
{
    public partial class SettingSample : Form
    {
        public SettingSample()
        {
            InitializeComponent();

            FormClosing += SettingSample_FormClosing;
            btnColorDialog.Click += BtnColorDialog_Click;
        }

        private void SettingSample_Load(object sender, EventArgs e)
        {
            this.Text = Properties.Settings.Default.Title;
            this.pbBGColor.BackColor = Properties.Settings.Default.BGColor;
            this.Location = new Point(Properties.Settings.Default.LocationX, Properties.Settings.Default.LocationY);
        }

        private void SettingSample_FormClosing(object sender, FormClosingEventArgs e)
        {
            // 無法指派為屬性或索引子 'Settings.Title'-- 其為唯讀
            // Properties.Settings.Default.Title = "範圍:應用程式 (Application) 為唯讀狀態,無法更改";

            Properties.Settings.Default.BGColor = this.pbBGColor.BackColor;
            Properties.Settings.Default.LocationX = this.Location.X;
            Properties.Settings.Default.LocationY = this.Location.Y;
            Properties.Settings.Default.Save();
        }

        private void BtnColorDialog_Click(object sender, EventArgs e)
        {
            ColorDialog cd = new ColorDialog();
            if (cd.ShowDialog() != DialogResult.OK)
            {
                pbBGColor.BackColor = Color.Empty;
                return;
            }

            pbBGColor.BackColor = cd.Color;
        }
    }
}

故意改變範圍為應用程式 (Application) 的 Title 設定值,馬上就會出現錯誤訊息,如下圖

  [C#] 應用程式設定檔 - Settings.settngs-3 4

控件 TextBox 直接綁定 BindingText 設定值

TextBox => ApplicationSettings => PropertyBinding

[C#] 應用程式設定檔 - Settings.settngs-4 

進入設定畫面後,跳至 Text 並選擇綁定 BindingText

   [C#] 應用程式設定檔 - Settings.settngs-5

在 TextBox 控件上就可以發現 ApplicationSettings 內多出一個 Text 設定,然後 Text Property 右側會有一個粉紅色小圖示顯示 [值繫結至應用程式設定 "BindingText"]

  [C#] 應用程式設定檔 - Settings.settngs-6

使用者設定值

實際執行後,會發現執行檔的 exe.config 檔案內容不會改變,該檔案是設定預設值,使用者對於 Settings.setting 變化,都會儲存在 C:\Users\使用者\AppData\Local\ProjectName 內

[C#] 應用程式設定檔 - Settings.settngs-7

打開 user.config xml 檔案內就可以看見使用者變化設定
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <userSettings>
        <ConfigSample.Properties.Settings>
            <setting name="BGColor" serializeAs="String">
                <value>Purple</value>
            </setting>
            <setting name="LocationX" serializeAs="String">
                <value>810</value>
            </setting>
            <setting name="LocationY" serializeAs="String">
                <value>179</value>
            </setting>
            <setting name="BindingText" serializeAs="String">
                <value>控件綁定 - 修正</value>
            </setting>
        </ConfigSample.Properties.Settings>
    </userSettings>
</configuration>
且 user.config 是根據版本號,版本號不同的話,user.config 也不同

[C#] 應用程式設定檔 - Settings.settngs-9

執行結果

[C#] 應用程式設定檔 - Settings.settngs-8 

沒有留言:

張貼留言