WPF C#将结果缓存到文本然后到列表框

Posted

技术标签:

【中文标题】WPF C#将结果缓存到文本然后到列表框【英文标题】:WPF C# Caching Results to Text then to Listbox 【发布时间】:2018-06-19 09:52:00 【问题描述】:

我正在玩这个。我将对应用程序中的对象实现某种类型的缓存,但我想全面了解它是如何工作的。显示的所有数据都是假数据和测试数据。不使用 PHI。

目标:将 SQL 表结果缓存到本地机器上的文本文件中。

什么有效? 从 SQL 表创建的文本文件。 在应用程序中读取文本文件。

什么不起作用? 在列表框或组合框中显示数据。

发生了什么事? 文本文件整洁干净。每行 1 条记录。没有多余的空格。当我将文本文件读入 MessageBox 时,宾果游戏。不错,简洁,易读。当我将文本显示到 ComboBox 或 ListBox 中时,每个全名中的每个字母都是一个新行。

XAML:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="50" />
        <RowDefinition />
    </Grid.RowDefinitions>
    <TextBlock Text="Name of Patient - " HorizontalAlignment="Center"
               VerticalAlignment="Center"
               Grid.Row="0" Grid.Column="0" />
    <TextBox Name="FullName" VerticalContentAlignment="Center"
             Text="Binding Path=EmployeeName, Mode=TwoWay"
             Height="30" Width="150" HorizontalAlignment="Center"
             VerticalAlignment="Center" Grid.Row="0" Grid.Column="1" />
    <Button Name="Search" Content="Search" Click="Search_Click"
            Grid.Row="0" Grid.Column="2" Height="30" Width="150" />
    <ListBox Height="200" Width="200" Name="LbFullName"
             ItemsSource="Binding" Grid.Row="1" Grid.Column="0"
             Grid.ColumnSpan="3" />
</Grid>

C#:

public partial class MainWindow

    //cache object
    private readonly ObjectCache _cache = MemoryCache.Default;

    public MainWindow()
    
        InitializeComponent();
        var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
        string dbFile = path + @"\\Razor Sharp Technology\\PharmaSYS Management Suite\\Files\\PatientNames.txt";
        SendSqlToText(dbFile);
    

    private void Search_Click(object sender, RoutedEventArgs e)
    
        // ReSharper disable once RedundantAssignment
        if (!(_cache["cachecontents"] is string cacheContents))
        
            var policy = new CacheItemPolicy AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0);

            var filePaths = new List<string>();
            var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
            filePaths.Add(path + "\\Razor Sharp Technology\\PharmaSYS Management Suite\\Files\\PatientNames.txt");

            policy.ChangeMonitors.Add(new
                                          HostFileChangeMonitor(filePaths));

            cacheContents =
                File.ReadAllText(path + "\\Razor Sharp Technology\\PharmaSYS Management Suite\\Files\\PatientNames.txt");

            _cache.Set("cachecontents", cacheContents, policy);
            LbFullName.DataContext = cacheContents;
            MessageBox.Show(cacheContents);
        
    

    private void SendSqlToText(string dbFile)
    
        var conString = ConfigurationManager.ConnectionStrings["Dbconn"].ConnectionString;
        using (var sqlConnection = new SqlConnection(conString))
        
            var cmd = "SELECT FullName FROM[dbo].[PatientData]";
            var command = new SqlCommand(cmd, sqlConnection);
            sqlConnection.Open();
            SqlDataReader sqlReader = command.ExecuteReader();
            using (StreamWriter file = new StreamWriter(dbFile, false))
            
                while (sqlReader.Read())
                
                    file.WriteLine(sqlReader["FullName"]);
                
            
        
    

【问题讨论】:

ItemsSource="Binding" 将 ItemsSource 设置为LbFullName.DataContext 中的字符串(即cacheContents)。 ItemsSource 需要一个 IEnumerable,字符串是 IEnumerable&lt;char&gt;,因此您会看到单个字符。 【参考方案1】:

您可以使用File.ReadAllLines()。这样一来,您可以将每一行作为 string[] 中的字符串来绑定。

步骤1

var strings = File.ReadAllLines(path + "\\Razor Sharp Technology\\PharmaSYS Management Suite\\Files\\PatientNames.txt");

第二步

将 ComboBox 的 ItemSource 绑定到您在 Step1 中填充的字符串 []。

使用ItemSource="Binding"

【讨论】:

如果我能帮助解决您的问题,如果您接受答案,我会很高兴 :)

以上是关于WPF C#将结果缓存到文本然后到列表框的主要内容,如果未能解决你的问题,请参考以下文章

如何将 DataGrid 中的文本框绑定到 Wpf 中的列表?

在列表框中选中复选框时更改文本框的颜色 c# wpf

将 Windows 窗体列表框保存到文本文件 C#

如何将文本框文本拆分为列表框 C#

WPF 从列表框中拖动项目并放入文本框中

使用数组 C# WPF 中的项目填充列表框