C#遍历多对象JSON数组取值并绑定到WinForms DataGridView控件
实现方法
首先先处理你现有代码的前置问题:你当前存储JSON的txt文件中,数组闭合标记}]之后混入了半截C#类构造函数的代码,这部分不属于合法JSON内容,直接调用反序列化方法会抛出格式错误,你需要先把文件里}]之后的所有冗余内容删除,保证文件内仅保留完整的JSON数组结构。
你反序列化得到的ReservationList是强类型的List<Reservation>集合,直接遍历集合取每个对象的属性值,或者直接做数据绑定就能把内容填充到DataGridView里,两种实现方式如下:
方式1:手动逐行填充
适合需要对每行每列内容做自定义处理的场景,代码如下:
private void ShowReservation_Click(object sender, EventArgs e) { // 读取文件内容 string jsonString = File.ReadAllText(Globals.filepath); // 配置反序列化规则:属性名大小写不敏感,避免字段名大小写匹配失败 JsonSerializerOptions jsonOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; // 反序列化得到强类型预约列表 List<Reservation> reservationList = JsonSerializer.Deserialize<List<Reservation>>(jsonString, jsonOptions); // 清空表格原有旧数据,避免重复加载 dataGridView1.Rows.Clear(); // 遍历所有预约对象,按列顺序添加到表格 foreach (Reservation item in reservationList) { dataGridView1.Rows.Add( item.Firstname, item.Lastname, item.Date, item.Table, item.NumberOfPersons, item.Phonenumber ); } }
注意:Rows.Add()传入的参数顺序必须和你初始化DataGridView时定义的列顺序完全一致,否则会出现内容列错位的问题。
方式2:数据源绑定(推荐)
不需要手动逐行添加,控件会自动完成属性和列的映射,代码更简洁易维护:
private void ShowReservation_Click(object sender, EventArgs e) { string jsonString = File.ReadAllText(Globals.filepath); JsonSerializerOptions jsonOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; List<Reservation> reservationList = JsonSerializer.Deserialize<List<Reservation>>(jsonString, jsonOptions); // 关闭自动生成列,使用你提前自定义好的6个列 dataGridView1.AutoGenerateColumns = false; // 给每个自定义列绑定对应的Reservation类属性 ColumnFirstName.DataPropertyName = nameof(Reservation.Firstname); ColumnSecondName.DataPropertyName = nameof(Reservation.Lastname); ColumnDate.DataPropertyName = nameof(Reservation.Date); ColumnTable.DataPropertyName = nameof(Reservation.Table); ColumnNumberOfPersons.DataPropertyName = nameof(Reservation.NumberOfPersons); ColumnPhoneNumber.DataPropertyName = nameof(Reservation.Phonenumber); // 直接将列表作为数据源绑定到表格,自动完成所有行的填充 dataGridView1.DataSource = reservationList; }
额外建议
- 建议给文件读取、反序列化逻辑加上
try-catch异常捕获,处理文件丢失、JSON格式损坏、权限不足等边缘场景,避免程序直接崩溃 - 如果后续需要修改预约信息,用数据源绑定的方式只需要修改
reservationList里的对象值,再重新绑定即可刷新表格,不需要手动操作单元格内容
内容的提问来源于stack exchange,提问作者GasmaskTerror
相关产品推荐
相关产品推荐

