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

WPF C#:SQL结果缓存至文本后ListBox/ComboBox显示异常

解决ListBox/ComboBox绑定文本文件内容时显示单个字符的问题

兄弟,我一眼就瞅出问题所在了!你现在把整个文本文件的字符串内容直接绑定给ListBox,但在C#里string默认实现了IEnumerable<char>——这就意味着ListBox会把字符串里的每个字符当成独立的列表项来渲染,难怪你看到每个姓名的单个字符占一行!

核心修复步骤

你需要把读取到的文本内容按行分割成字符串列表,再绑定到ListBox的ItemsSource,而不是直接绑定整个字符串。

修改你的Search_Click方法,替换原来的绑定逻辑:

private void Search_Click(object sender, RoutedEventArgs e)
{
    if (!(_cache["cachecontents"] is List<string> patientNames))
    {
        var policy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0) };
        var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
        var filePath = path + "\\Razor Sharp Technology\\PharmaSYS Management Suite\\Files\\PatientNames.txt";
        var filePaths = new List<string> { filePath };
        
        policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));
        
        // 读取文本并按换行符分割成列表,同时过滤空行
        var cacheContents = File.ReadAllText(filePath);
        patientNames = cacheContents.Split(
            new[] { Environment.NewLine }, 
            StringSplitOptions.RemoveEmptyEntries
        ).ToList();
        
        _cache.Set("cachecontents", patientNames, policy);
    }
    
    // 直接把列表绑定到ListBox的ItemsSource
    LbFullName.ItemsSource = patientNames;
    MessageBox.Show(string.Join(Environment.NewLine, patientNames));
}

为什么这么改?

  1. 分割字符串为列表:Split(Environment.NewLine)会把每行文本拆成单独的字符串元素,RemoveEmptyEntries能避免文本末尾的空行被当成无效项。
  2. 缓存优化:直接缓存处理后的List<string>,而不是原始字符串,下次点击搜索时不需要重复分割,效率更高。
  3. 正确绑定数据源:ListBox的ItemsSource接受集合类型(比如List<string>),这样每个元素对应一行姓名,就能正常显示了。

额外提示

你的XAML里ListBox的ItemsSource="{Binding}"可以保留,但如果直接在代码里赋值ItemsSource,效果是一样的。如果后续需要更复杂的显示模板,比如自定义每个列表项的样式,再添加DataTemplate即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:55:48