You need to enable JavaScript to run this app. 如何将XML数据反序列化为Vehicle类列表并绑定到WinForm的DataGridView
优惠活动
大模型
产品
解决方案
定价
更多

如何将XML数据反序列化为Vehicle类列表并绑定到WinForm的DataGridView

解决方案

1. 补充Vehicle类无参构造函数

XML反序列化要求目标类必须存在无参数构造函数,你当前的Vehicle类仅定义了带参构造,需要补充:

namespace VehicleSystem
{
    [XmlType("vehicle")]
    [Serializable]
    public class Vehicle
    {
        // 原有属性、带参构造保持不变
        // 新增无参构造函数
        public Vehicle()
        {
        }
    }
}

2. 给Business类新增反序列化加载方法

添加Load方法实现XML数据读取,同时修复启动覆盖问题的核心逻辑:应用启动时先读取旧数据到内存列表,再执行新增操作就不会覆盖原有数据。修改后的Business类代码如下:

using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

namespace VehicleSystem
{
    public class Business
    {
        private static List<Vehicle> _vehicleList = new List<Vehicle>();
        // 固定文件路径建议定义为常量
        private const string SavePath = @"C:\temp\data.xml";

        public static List<Vehicle> VehicleList
        {
            get => _vehicleList;
        }

        // 新增反序列化加载方法
        public static void Load()
        {
            // 先判断存储目录是否存在,不存在则创建避免报错
            string dir = Path.GetDirectoryName(SavePath);
            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }
            // 文件不存在时直接返回,保持空列表
            if (!File.Exists(SavePath))
            {
                return;
            }
            XmlSerializer serial = new XmlSerializer(typeof(List<Vehicle>));
            using (FileStream fs = new FileStream(SavePath, FileMode.Open))
            {
                _vehicleList = (List<Vehicle>)serial.Deserialize(fs);
            }
        }
      
        public static void Save()
        {
            string dir = Path.GetDirectoryName(SavePath);
            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }
            XmlSerializer serial = new XmlSerializer(typeof(List<Vehicle>));
            using (FileStream file = new FileStream(SavePath, FileMode.Create))
            {
                serial.Serialize(file, VehicleList);
            }
        }
    }
}

3. 应用启动时调用加载逻辑

在主窗体的Form_Load事件中优先调用Load方法,把原有数据加载到内存:

private void MainForm_Load(object sender, EventArgs e)
{
    // 启动时先加载旧数据
    Business.Load();
    // 绑定数据到DataGridView
    RefreshGrid();
}

// 封装DataGridView刷新方法,新增/删除数据后调用即可
private void RefreshGrid()
{
    dataGridView1.DataSource = null;
    dataGridView1.DataSource = Business.VehicleList;
}

4. 新增车辆后的操作

新增车辆之后调用Save保存,再刷新DataGridView即可:

Business.VehicleList.Add(new Vehicle("ABC123","Hilux","Toyota", 1992, 123));
Business.Save();
// 刷新视图
RefreshGrid();

如果需要实现新增/修改数据时DataGridView自动更新,不需要手动调用刷新,可以把Business类中的List<Vehicle>替换为BindingList<Vehicle>,该类型支持变更通知,绑定后会自动同步视图和数据源。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 04:54:06