C#实现加载本地JSON文件到ListBox并显示选中项属性
WinForm加载本地JSON用户文件到ListBox及选中填充表单实现方案
功能实现前置说明
所有用户JSON文件统一存储在程序运行目录下的Output文件夹,基于你已经实现的UserAccount实体类、JsonMgr序列化工具,分两步完成需求即可。
1. 加载目录下所有JSON文件绑定到ListBox
封装独立的列表刷新方法,在窗体加载、新增用户成功后都可以调用,保证列表实时更新。
private void RefreshUserList() { string outputFolder = Path.Combine(Environment.CurrentDirectory, "Output"); // 首次运行目录不存在时自动创建,避免路径报错 if (!Directory.Exists(outputFolder)) { Directory.CreateDirectory(outputFolder); } // 读取目录下所有.json后缀的文件,构造绑定数据源 var userFileSource = Directory.GetFiles(outputFolder, "*.json") .Select(fullPath => new { ShowName = Path.GetFileName(fullPath), // ListBox显示内容:带用户名的文件名 FileFullPath = fullPath // 隐藏存储:文件的完整磁盘路径 }) .ToList(); // 配置ListBox显示字段与值字段,完成绑定 lstUsers.DisplayMember = "ShowName"; lstUsers.ValueMember = "FileFullPath"; lstUsers.DataSource = userFileSource; }
注意:不要直接把文件名列表绑定到ListBox,存储文件全路径可以避免后续读取时重复拼接路径,减少路径错误概率。
调用时机说明:
- 在窗体的
Load事件中调用一次完成初始加载 - 在你之前写的新增用户逻辑中,序列化文件成功后、弹出成功提示前加一句
RefreshUserList(),就能实时看到新增的用户条目
2. 选中ListBox条目时解析JSON填充表单
给ListBox控件添加SelectedIndexChanged事件,选中项变化时自动读取对应文件、反序列化后填充表单控件。
private void lstUsers_SelectedIndexChanged(object sender, EventArgs e) { // 无选中项时直接返回 if (lstUsers.SelectedItem == null) return; string selectedFile = lstUsers.SelectedValue.ToString(); // 校验文件是否存在,不存在则刷新列表移除无效条目 if (!File.Exists(selectedFile)) { MessageBox.Show("选中的用户文件已丢失", "读取错误", MessageBoxButtons.OK, MessageBoxIcon.Error); RefreshUserList(); return; } // 反序列化JSON为UserAccount实体,对应你现有JsonMgr补全反序列化方法即可 UserAccount currentUser = JsonMgr.DeserializeFromFile<UserAccount>(selectedFile); if (currentUser == null) { MessageBox.Show("用户文件格式损坏,无法解析", "读取错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } // 逐个给表单控件赋值 txtFirstName.Text = currentUser.FirstName; txtLastName.Text = currentUser.LastName; txtEmail.Text = currentUser.Email; txtTeamName.Text = currentUser.TeamName; txtPassword.Text = currentUser.Password; chkIsActive.Checked = currentUser.IsActive == "Yes"; txtUserId.Text = currentUser.UserId.ToString(); }
补充说明
如果你的JsonMgr工具类目前只有序列化方法,补充对应的文件反序列化方法即可,逻辑和序列化对应:读取目标文件的全部文本内容,再反序列化为指定的泛型类型对象。额外注意两个细节:
- 路径拼接统一用
Path.Combine()方法处理,避免手动拼接字符串出现多斜杠、少斜杠的路径错误 - 给
txtUserId赋值前不需要额外做复杂类型转换,数字类型调用ToString()即可直接赋值给文本框
内容的提问来源于stack exchange,提问作者steamboy naratsu
相关产品推荐
相关产品推荐

