如何将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
相关产品推荐
相关产品推荐

