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

时间:2017-05-22 12:27:33

标签: c# winforms listview streamreader

我正在使用带有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

加载后的ListView:

enter image description here

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

3 个答案:

答案 0 :(得分:2)

您在此完成的工作如下:

  1. 您阅读整个文件并将其加载到内存中
  2. 您将大字符串拆分为数组
  3. 您只使用该数组的前三项创建并添加ListViewItem
  4. 对于前三项,最后一项操作仅执行一次。 为了获得所需的结果,您需要在循环中执行最后一个操作。这样就可以解析所有数据。当你在它的时候,也最好在循环中读取文件,而不是将它全部加载到内存中。

    使用此:

    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语句,以确保它始终处于正确处理状态,即使存在异常。

答案 1 :(得分:0)

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

[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);
    }
}

答案 2 :(得分:0)

您需要循环fileItems []数组。

你有

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

需要包裹在循环中