【问题标题】:Loading a ListView from file, only displays every other record从文件加载 ListView,只显示所有其他记录
【发布时间】:2017-04-23 07:58:24
【问题描述】:

我创建了一个从文本文件加载 ListView 的方法。但是,问题是我的 ListView 只显示所有其他记录。由于某种原因,它只显示偶数项目...2、4、6等。我需要它来显示所有项目。任何帮助将不胜感激。方法如下……

public partial class Admin : Form
{
    const string ITEMSFILE = "items.dat";
    const char DELIM = ',';

    List<Item> itemList = new List<Item>();

    public Admin()
    {
        InitializeComponent();

        load2();

        itemsListView.View = View.Details;

        itemsListView.Columns.Add("ID");
        itemsListView.Columns.Add("Item Name");
        itemsListView.Columns.Add("Cost");
        itemsListView.Columns.Add("Category");

  itemsListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
    itemsListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
    }

    public void load2()
    {
        using (FileStream file = new FileStream(ITEMSFILE, FileMode.Open, FileAccess.Read))
        using (StreamReader reader = new StreamReader(file))
        {
            string recordIn;
            string[] fields;
            string itemline;
            itemsListView.Items.Clear();
            try
            {
                while ((itemline = reader.ReadLine()) != null)
                {                      
                    recordIn = reader.ReadLine();
                    fields = recordIn.Split(DELIM);
                    itemsListView.Items.Add(new ListViewItem(new string[] { fields[0], fields[1], fields[2], fields[3] }));            
                }
            }
            catch (NullReferenceException)
            {
                //TODO
            }
        }
    }
}

这是文本文件的内容......

1,Bud light,3.50,Drinks
2,Michelob ultra,3.50,Drinks
3,Heineken,4.00,Drinks
4,Miller lite,3.50,Drinks
5,Busch,2.50,Drinks
6,Pabst,2.50,Drinks

错误输出示例...

更新 - 修订的工作代码 失望我被否决了。这是我修改后的工作代码...

using System;
using static System.Console;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;

namespace LoadList
{
    public partial class Admin : Form
    {
        const string ITEMSFILE = "items.dat";
        const char DELIM = ',';

        List<Item> itemList = new List<Item>();

        public Admin()
        {
            InitializeComponent();

            load2();
        }

        public void load2()
        {
            using (FileStream file = new FileStream(ITEMSFILE, FileMode.Open, FileAccess.Read))
            using (StreamReader reader = new StreamReader(file))
            {
                string recordIn;
                string[] fields;
                string itemline;
                itemsListView.Items.Clear();

                while (!reader.EndOfStream)
                {                      
                    recordIn = reader.ReadLine();
                    fields = recordIn.Split(DELIM);
                    itemsListView.Items.Add(new ListViewItem(new string[] { fields[0], fields[1], fields[2], fields[3] }));            
                }

            }
        }
    }
}

【问题讨论】:

  • catch (NullReferenceException) — 这是什么?
  • 尝试使用调试器并单步调试您的代码。

标签: c# winforms listview


【解决方案1】:

您正在阅读两行:

...
while ((itemline = reader.ReadLine()) != null) <- 1st
{                      
    recordIn = reader.ReadLine(); <- 2nd
    ...

去掉第二个,用itemline代替recordIn

【讨论】:

  • Ofir,感谢您为我指明了正确的方向。我将循环上的条件更改为 (!reader.EndOfStream),现在效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 2020-02-03
  • 1970-01-01
相关资源
最近更新 更多