WPF C# CSV人员管理系统:PersonID重置与表头重复问题求助
解决WPF C# CSV人员管理系统的两个问题
问题1:重启程序后PersonID从1重新递增
当前personID是页面类的局部字段,程序重启后会被重置为0,导致每次重启新增人员时ID从1开始。解决思路是读取已有CSV文件中的最大PersonID,以此作为初始值。
问题2:每次添加人员重复写入表头
因为每次调用csvContext.Write时都设置了FirstLineHasColumnNames = true,导致每次追加数据都会写入表头。解决思路是判断文件是否存在,仅在文件不存在时写入表头。
修改后的AddPerson.xaml.cs代码
namespace WPFApp { /// <summary> /// Interaction logic for AddPerson.xaml /// </summary> public partial class AddPerson : Page { int personID = 0; public AddPerson() { InitializeComponent(); // 从CSV文件读取最大PersonID作为初始值 personID = GetMaxPersonId(); } private int GetMaxPersonId() { if (!File.Exists("PersonFIles.csv")) return 0; var csvContext = new CsvContext(); var csvFileDescription = new CsvFileDescription { FirstLineHasColumnNames = true, SeparatorChar = ',' }; try { var persons = csvContext.Read<Person>("PersonFIles.csv", csvFileDescription).ToList(); if (persons.Count == 0) return 0; // 获取最大ID,处理空值情况 return persons.Max(p => string.IsNullOrEmpty(p.personID) ? 0 : int.Parse(p.personID)); } catch { // 读取失败或格式异常时返回0 return 0; } } private void AddButton_Click(object sender, RoutedEventArgs e) { personID++; var personList = new List<Person>() { new Person{ personID = personID.ToString(), LastName = LastNameBox.Text, FirstName = FirstNameBox.Text, MiddleName = MiddleNameBox.Text} }; bool fileExists = File.Exists("PersonFIles.csv"); var csvFileDescription = new CsvFileDescription { // 仅当文件不存在时写入表头 FirstLineHasColumnNames = !fileExists, SeparatorChar = ',' }; var csvContext = new CsvContext(); using (TextWriter writer = new StreamWriter("PersonFIles.csv", true)) { csvContext.Write(personList, writer, csvFileDescription); } MessageBox.Show($"人员添加成功!Person ID: {personID}"); LastNameBox.Clear(); FirstNameBox.Clear(); MiddleNameBox.Clear(); } } }
说明
- ID递增逻辑:在页面构造函数中调用
GetMaxPersonId方法,读取CSV中已有的最大ID,确保重启程序后从该值继续递增。如果文件不存在或读取失败,默认从0开始。 - 表头控制:通过
File.Exists判断文件是否存在,仅在文件首次创建时写入表头,后续追加数据时不再重复写入。
内容的提问来源于stack exchange,提问作者Vance Gaspar
相关产品推荐
相关产品推荐

