You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将WinForms GUI控件信息保存到XML文件?

如何将WinForms控件数据保存到XML文件并读取

要实现控件数据的XML保存和读取,最简洁可靠的方式是用XML序列化——先把需要保存的控件数据封装成一个实体类,再通过序列化/反序列化完成读写,比手动拼接XML字符串高效且不易出错。

步骤1:创建数据模型类

定义一个类,对应你要保存的所有控件数据,加上[Serializable]标记让它支持XML序列化:

[Serializable]
public class UserData
{
    public string TextBox1Content { get; set; }
    public string TextBox2Content { get; set; }
    public string TextBox3Content { get; set; }
    public bool CheckBox1Checked { get; set; }
    public bool CheckBox2Checked { get; set; }
    public string ComboBoxSelectedText { get; set; }
}

步骤2:实现保存功能(修改saveToolStripMenuItem_Click方法)

把当前控件的数值填充到UserData对象,再序列化到选中的XML文件:

private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
    using (SaveFileDialog saveFileDialog1 = new SaveFileDialog())
    {
        saveFileDialog1.Filter = "XML文件 (*.xml)|*.xml|所有文件 (*.*)|*.*";
        saveFileDialog1.FilterIndex = 1; // 默认选中XML格式
        saveFileDialog1.RestoreDirectory = true;

        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            // 填充数据模型
            var userData = new UserData
            {
                TextBox1Content = textBox1.Text,
                TextBox2Content = textBox2.Text,
                TextBox3Content = textBox3.Text,
                CheckBox1Checked = checkBox1.Checked,
                CheckBox2Checked = checkBox2.Checked,
                ComboBoxSelectedText = comboBox1.SelectedItem?.ToString() ?? string.Empty
            };

            // 序列化到XML文件
            var serializer = new XmlSerializer(typeof(UserData));
            using (var writer = new StreamWriter(saveFileDialog1.FileName))
            {
                serializer.Serialize(writer, userData);
            }
        }
    }
}

步骤3:实现读取功能(修改openToolStripMenuItem_Click_1方法)

读取XML文件并反序列化为UserData对象,再把数据回填到控件:

private void openToolStripMenuItem_Click_1(object sender, EventArgs e)
{
    using (OpenFileDialog openFileDialog = new OpenFileDialog())
    {
        openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        openFileDialog.Filter = "XML文件 (*.xml)|*.xml|所有文件 (*.*)|*.*";
        openFileDialog.FilterIndex = 1;
        openFileDialog.RestoreDirectory = true;

        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            // 反序列化XML文件
            var serializer = new XmlSerializer(typeof(UserData));
            using (var reader = new StreamReader(openFileDialog.FileName))
            {
                var userData = (UserData)serializer.Deserialize(reader);

                // 回填数据到控件
                textBox1.Text = userData.TextBox1Content;
                textBox2.Text = userData.TextBox2Content;
                textBox3.Text = userData.TextBox3Content;
                checkBox1.Checked = userData.CheckBox1Checked;
                checkBox2.Checked = userData.CheckBox2Checked;
                
                // 设置ComboBox选中项(如果存在匹配项)
                if (!string.IsNullOrEmpty(userData.ComboBoxSelectedText) && comboBox1.Items.Contains(userData.ComboBoxSelectedText))
                {
                    comboBox1.SelectedItem = userData.ComboBoxSelectedText;
                }
                else
                {
                    comboBox1.SelectedIndex = -1; // 无匹配项则清空选中
                }
            }
        }
    }
}

步骤4:添加必要的命名空间

在代码顶部加入XML序列化所需的引用:

using System.Xml.Serialization;

完整修改后的Form1代码

using System;
using System.IO;
using System.Windows.Forms;
using System.Xml.Serialization;

namespace TestApp
{
    [Serializable]
    public class UserData
    {
        public string TextBox1Content { get; set; }
        public string TextBox2Content { get; set; }
        public string TextBox3Content { get; set; }
        public bool CheckBox1Checked { get; set; }
        public bool CheckBox2Checked { get; set; }
        public string ComboBoxSelectedText { get; set; }
    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // 重复方法,可删除或合并到openToolStripMenuItem_Click_1
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void openToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            using (OpenFileDialog openFileDialog = new OpenFileDialog())
            {
                openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                openFileDialog.Filter = "XML文件 (*.xml)|*.xml|所有文件 (*.*)|*.*";
                openFileDialog.FilterIndex = 1;
                openFileDialog.RestoreDirectory = true;

                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    var serializer = new XmlSerializer(typeof(UserData));
                    using (var reader = new StreamReader(openFileDialog.FileName))
                    {
                        var userData = (UserData)serializer.Deserialize(reader);

                        textBox1.Text = userData.TextBox1Content;
                        textBox2.Text = userData.TextBox2Content;
                        textBox3.Text = userData.TextBox3Content;
                        checkBox1.Checked = userData.CheckBox1Checked;
                        checkBox2.Checked = userData.CheckBox2Checked;
                        
                        if (!string.IsNullOrEmpty(userData.ComboBoxSelectedText) && comboBox1.Items.Contains(userData.ComboBoxSelectedText))
                        {
                            comboBox1.SelectedItem = userData.ComboBoxSelectedText;
                        }
                        else
                        {
                            comboBox1.SelectedIndex = -1;
                        }
                    }
                }
            }
        }

        private void saveToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (SaveFileDialog saveFileDialog1 = new SaveFileDialog())
            {
                saveFileDialog1.Filter = "XML文件 (*.xml)|*.xml|所有文件 (*.*)|*.*";
                saveFileDialog1.FilterIndex = 1;
                saveFileDialog1.RestoreDirectory = true;

                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    var userData = new UserData
                    {
                        TextBox1Content = textBox1.Text,
                        TextBox2Content = textBox2.Text,
                        TextBox3Content = textBox3.Text,
                        CheckBox1Checked = checkBox1.Checked,
                        CheckBox2Checked = checkBox2.Checked,
                        ComboBoxSelectedText = comboBox1.SelectedItem?.ToString() ?? string.Empty
                    };

                    var serializer = new XmlSerializer(typeof(UserData));
                    using (var writer = new StreamWriter(saveFileDialog1.FileName))
                    {
                        serializer.Serialize(writer, userData);
                    }
                }
            }
        }
    }
}

注意事项

  • 如果ComboBox是动态加载选项,建议同时保存选中项的Value(若有),避免Text变化导致匹配失效。
  • 可启用你注释的validateUserEntry方法,在保存前校验必填项。
  • 初始目录改为“我的文档”更通用,可根据需求自行调整。

内容的提问来源于stack exchange,提问作者programmer101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:15:53