将文本文件中的多个项目加载到 ListView C#

Loading multiple items from a text file to a ListView C#

我正在使用带有 visual studio 的 windows 表单应用程序创建购物篮表单,我有一个包含一些产品的文本文件,当用户选择加载时,我想读取该文件,然后然后将数据放入 ListView 但它只执行第一项。

这是我目前的代码和我的结果:

private void LoadOrder_Click(object sender, EventArgs e)
    {
        Stream myStream = null;
        OpenFileDialog theDialog = new OpenFileDialog();
        theDialog.Title = "Open Text File";
        theDialog.Filter = "TXT files|*.txt";
        theDialog.InitialDirectory = @"C:\";
        if (theDialog.ShowDialog() == DialogResult.OK)
        {
            try
            {
                if ((myStream = theDialog.OpenFile()) != null)
                {
                    using (myStream)
                    {
                        System.IO.StreamReader sr = new System.IO.StreamReader(myStream);
                        string fileContent = sr.ReadToEnd();
                        string[] fileItems = fileContent.Split('|');
                        sr.Dispose();

                        ListViewItem lv = new ListViewItem();
                        lv.Text = fileItems[0].ToString();
                        lv.SubItems.Add(fileItems[1].ToString());
                        lv.SubItems.Add(fileItems[2].ToString());
                        basket.Items.Add(lv);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
            }
        }
    }

文本文件:

Banana|6|0.25
Steak|2|1.75
Chips|1|3
Sweets|6|1.5

加载后的列表视图:

如果有人能帮助我或指出正确的方向,我将不胜感激,谢谢!

在您的代码中,您正在读取文件内容并将其拆分为 | 个字符。那将 return 你的字符串数组看起来像这样:

[0]Banana
[1]6
[2]0.25
[3]Steak
[4]2
[5]1.75

等 由于你的数据比较少,我建议你使用 File.ReadAllLines 然后分割每一行。像这样:

if (theDialog.ShowDialog() == DialogResult.OK)
{
    var lines = File.ReadAllLines(theDialog.FileName);
    foreach (string line in lines)
    {
        string[] fileItems = line.Split('|');
        ListViewItem lv = new ListViewItem();
        lv.Text = fileItems[0].ToString();
        lv.SubItems.Add(fileItems[1].ToString());
        lv.SubItems.Add(fileItems[2].ToString());
        basket.Items.Add(lv);
    }
}

您在此处所做的如下:

  1. 您读取了整个文件并将其加载到内存中
  2. 您将大字符串拆分为一个数组
  3. 您仅使用该数组的前三项创建并添加了 ListViewItem

前三项的最后一个操作仅执行一次。 为了获得您想要的结果,您需要循环执行最后一个操作。这样所有的数据都会被解析。当你这样做时,最好也循环读取文件,而不是将其全部加载到内存中。

使用这个:

if ((myStream = theDialog.OpenFile()) != null)
{
    using (myStream)
    {
        using (var sr = new System.IO.StreamReader(myStream)) // Wrapped it up in a using statement so it is disposed of automagically
        {
            string line = string.Empty;
            while ((line = sr.ReadLine()) != null) // Loop while there is more data to read
            {
                string[] lineItems = line.Split('|'); // Split only the single line

                ListViewItem lv = new ListViewItem();
                lv.Text = lineItems[0];
                lv.SubItems.Add(lineItems[1]);
                lv.SubItems.Add(lineItems[2]);
                basket.Items.Add(lv);
            }
        }
    }
}

这里我们做的是一行一行读取,然后对每一行进行ListViewItem的拆分和创建。请记住,这是使其工作的最基本代码。理想情况下,您应该添加验证代码(即确保每行数据对您的目的有效)。

此外,避免像 StreamReader 这样手动处理对象。相反,使用 using 语句,以确保它始终被正确处理,即使出现异常也是如此。

您需要循环 fileItems[] 数组。

你有

 lv.Text = fileItems[0].ToString();
                    lv.SubItems.Add(fileItems[1].ToString());
                    lv.SubItems.Add(fileItems[2].ToString());
                    basket.Items.Add(lv);

需要包裹在一个循环中