You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用DataSource绑定JSON数据到ListBox报错的解决方法

报错原因

ListBox控件的DataSource属性仅支持实现了IList或IListSource接口的集合类型作为数据源,你直接传入单个UserAccount实体实例不符合参数要求,因此触发绑定错误。你不需要将实体转换为字符串列表,直接绑定强类型的实体集合即可,还能保留完整的对象属性,方便后续业务逻辑处理。

实现步骤
  • 遍历Output文件夹下的JSON文件时,先将所有反序列化得到的UserAccount对象存入List<UserAccount>集合
  • 绑定前先将DataSource置空,避免重复绑定引发异常
  • 配置DisplayMember属性,指定列表项展示的实体字段(比如团队名、用户名),避免列表默认显示对象的类型全限定名
  • (可选)配置ValueMember属性,指定列表项关联的值字段(比如UserId),后续可直接通过SelectedValue获取对应ID,无需额外查询
  • 将填充完成的集合整体赋值给DataSource属性完成绑定
完整代码
private void ShowListView()
{
    var dir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
    var outputDir = Path.Combine(dir, "Output");
    
    // 初始化强类型用户集合存储所有反序列化结果
    List<UserAccount> userList = new List<UserAccount>();

    foreach (var file in Directory.GetFiles(outputDir, "*.json"))
    {
        var text = File.ReadAllText(file);
        var model = JsonConvert.DeserializeObject<UserAccount>(text);
        userList.Add(model);
    }

    // 清空原有绑定
    listBoxUsers.DataSource = null;
    // 指定列表显示的字段,可根据需求替换为FirstName、LastName等属性名
    listBoxUsers.DisplayMember = "TeamName";
    // 指定值字段,可选配置
    listBoxUsers.ValueMember = "UserId";
    // 绑定集合,List<UserAccount>实现了IList接口,符合绑定要求
    listBoxUsers.DataSource = userList;
}
后续取值方式

绑定完成后不需要通过文本匹配查找用户信息,可直接获取选中的完整实体对象:

if (listBoxUsers.SelectedItem is UserAccount selectedUser)
{
    // 可直接访问selectedUser的所有属性,比如Email、IsActive、UserId等
    MessageBox.Show($"选中用户邮箱:{selectedUser.Email}");
}

如果配置了ValueMember,也可直接通过listBoxUsers.SelectedValue获取当前选中项对应的UserId。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:21:40