首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# WinForms 實作 XML 設定檔動態讀寫與 UI 同步

     編輯:關於C語言

專案常需讓使用者透過介面編輯 XML 設定檔。本文示範完整的 WinForms 解決方案:動態載入 XML 節點生成編輯介面、使用者修改後寫回 XML,採用 XmlDocument 操作,程式碼結構清晰,易於擴充。

專案架構概覽

  • Form1:主視窗,含開啟檔案按鈕、儲存按鈕、動態控制項容器
  • XMLConfig:專責 XML 讀寫的工具類別,封裝載入、查詢、更新、儲存邏輯
  • Sample.xml:範例設定檔,根節點 <rss> 下含多個屬性式子節點

1. 介面佈局

在 Form 上放置:

  • Button btnLoad - 選擇 XML 檔案
  • Button btnSave - 寫入修改
  • Panel panel1 - 動態生成 Label + TextBox 配對
  • OpenFileDialog - 篩選 *.xml

2. XMLConfig 核心類別

資料結構

public class XMLConfig
{
    public int Count { get; private set; }
    public string Path { get; private set; }
    private List<string> _names = new List<string>();   // 節點 Name 屬性
    private List<string> _values = new List<string>();  // 節點 InnerText

    public XMLConfig(string path) { LoadXml(path); }

    private void LoadXml(string path) { ... }
    public int GetCount() => Count;
    public string GetName(int index) => _names[index];
    public string GetValue(int index) => _values[index];
    public void UpdateValue(int index, string newValue) => _values[index] = newValue;
    public void SaveAll() { ... }
}

載入邏輯(建構子)

private void LoadXml(string path)
{
    Path = path;
    var doc = new XmlDocument();
    doc.Load(path);
    var root = doc.SelectSingleNode("rss");
    foreach (XmlNode node in root.ChildNodes)
    {
        _names.Add(node.Attributes["Name"]?.Value ?? "");
        _values.Add(node.InnerText);
    }
    Count = _names.Count;
}

儲存邏輯

public void SaveAll()
{
    var doc = new XmlDocument();
    doc.Load(Path);
    var nodes = doc.SelectSingleNode("rss").ChildNodes;
    for (int i = 0; i < nodes.Count; i++)
    {
        var elem = (XmlElement)nodes[i];
        if (elem.Attributes["Name"]?.Value == _names[i])
            elem.InnerText = _values[i];
    }
    doc.Save(Path);
}

3. Form1 互動邏輯

載入 XML 並動態建立編輯欄位

private void btnLoad_Click(object sender, EventArgs e)
{
    var ofd = new OpenFileDialog
    {
        InitialDirectory = Application.StartupPath,
        Filter = "XML 檔案|*.xml",
        RestoreDirectory = true
    };
    if (ofd.ShowDialog() != DialogResult.OK) return;

    _xmlConfig = new XMLConfig(ofd.FileName);
    panel1.Controls.Clear();

    const int Y_SPACING = 30, X_LABEL = 3, LABEL_W = 60;
    for (int i = 0; i < _xmlConfig.GetCount(); i++)
    {
        var lbl = new Label
        {
            Text = _xmlConfig.GetName(i),
            Size = new Size(LABEL_W, 23),
            AutoSize = false,
            Location = new Point(X_LABEL, i * Y_SPACING)
        };
        var txt = new TextBox
        {
            Text = _xmlConfig.GetValue(i),
            Tag = i,                     // 存索引供儲存時識別
            Location = new Point(X_LABEL + LABEL_W + 10, i * Y_SPACING)
        };
        panel1.Controls.Add(lbl);
        panel1.Controls.Add(txt);
    }
}

遍歷 Panel 控制項寫回 XML

private void btnSave_Click(object sender, EventArgs e)
{
    foreach (Control ctrl in panel1.Controls)
    {
        if (ctrl is TextBox txt && txt.Tag != null)
        {
            int index = Convert.ToInt32(txt.Tag);
            _xmlConfig.UpdateValue(index, txt.Text);
        }
    }
    _xmlConfig.SaveAll();
    MessageBox.Show("儲存完成");
}

4. 範例 XML 結構

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <Student Name="姓名">寧澤濤</Student>
  <Age Name="年齡">22</Age>
  <Hobby Name="愛好">游泳</Hobby>
</rss>

說明:每個子節點以 Name 屬性作為顯示標題,InnerText 為可編輯值。

擴充建議

  • 加入節點型別屬性(string/int/bool),TextBox 換成對應編輯器
  • 支援巢狀節點,遞迴生成 TreeView 編輯介面
  • 加入驗證邏輯(必填、格式、範圍),儲存前攔截
  • 改用 XDocument (LINQ to XML) 簡化查詢與更新語法

小結

此範例展示了「資料層與 UI 層分離」的經典模式:XMLConfig 專注 XML 操作,Form 專注介面呈現與互動。動態生成控制項技巧配合 Tag 屬性索引,能靈活應對結構不固定的設定檔編輯需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved