【问题标题】:Loading multiple items from a text file to a ListView C#将多个项目从文本文件加载到 ListView C#
【发布时间】:2017-05-22 12:27:33
【问题描述】:

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

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

【问题讨论】:

  • 你能发布完整的 ex.StackTrace 吗?

标签: c# winforms listview streamreader


【解决方案1】:

您在这里所做的如下:

  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 语句,以确保始终正确处理它,即使出现异常也是如此。

【讨论】:

    【解决方案2】:

    在您的代码中,您正在读取文件内容并将其拆分为| 字符。这将返回您的字符串数组,如下所示:

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

    【讨论】:

      【解决方案3】:

      您需要循环 fileItems[] 数组。

      你在哪里

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

      需要被包裹在一个循环中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多