使用 BindingSource 将 CSV 加载到列表中

Loading CSV into List using BindingSource

我正在尝试使用 BindingSource 将包含 'Workstations' 列表的 csv 文件加载到列表中。这是我现在拥有的。

    OpenFileDialog of = new OpenFileDialog();
    List<Workstation> invList = new List<Workstation>();
    BindingSource bs = new BindingSource();
    bs.DataSource = invList;
    listBox1.DisplayMember = "display";

    public class Workstation
    {
        public string name { get; set; }
        public string serviceTag { get; set; }
        public string display
        {
            get
            {
                return name + " | " + serviceTag;
            }
        }
        public string type { get;set; }
        public string os { get; set; }
        public string make { get; set; }
        public string model { get; set; }
        public int hd { get; set; }
        public int ram { get; set; }
        public string location { get; set; }
        public string ip { get; set; }
        public string notes { get; set; }
    }



private void resume()
{
    try
    {
        filePath = of.FileName;

        var loadedWorkstation = new Workstation();
        string[] line = System.IO.File.ReadAllLines(filePath);
        List<string> doc = new List<string>();

        for(int x = 0;x < line.Length; x++)
        {
            doc = line[x].Split(',').ToList();
            loadedWorkstation.name = doc[0];
            loadedWorkstation.serviceTag = doc[1];
            loadedWorkstation.make = doc[2];
            loadedWorkstation.model = doc[3];
            loadedWorkstation.ram = Convert.ToInt32(doc[4]);
            loadedWorkstation.hd = Convert.ToInt32(doc[5]);
            loadedWorkstation.os = doc[6];
            loadedWorkstation.location = doc[7];
            loadedWorkstation.type = doc[8];
            loadedWorkstation.ip = doc[9];
            loadedWorkstation.notes = doc[10];
            invList.Insert(0, loadedWorkstation);

            bs.ResetBindings(false);
            listBox1.DataSource = bs;
            }

        }
}

我遇到的问题是 csv 文件如下所示:

Dave's PC,19NMX32,Dell,Optiplex 2010,0,0,,Office Desk,,10.10.77.138,
Blake's PC,20NMX12,Dell,Optiplex 3020,0,0,,Office Desk,,10.10.77.136,
John's PC,4NMX17,Dell,Optiplex 3020,0,0,,Office Desk,,10.10.77.131,
Jake's PC,12NMX32,Dell,Optiplex 3020,0,0,,Office Desk,,10.10.77.132,

当我加载它时,列表和列表框显示如下:

Dave's PC | 19NMX32
Dave's PC | 19NMX32
Dave's PC | 19NMX32
Dave's PC | 19NMX32

移动这条线

var loadedWorkstation = new Workstation();

循环内部

for(int x = 0;x < line.Length; x++)
{
    doc = line[x].Split(',').ToList();
    var loadedWorkstation = new Workstation();
    loadedWorkstation.name = doc[0];
    ....

您当前的代码始终使用 Workstation class 的相同实例。您为文件中的每一行重复添加相同的实例。

在循环中,您不构建新实例,而是更改创建的唯一 Workstation 实例的属性。这导致在循环结束时,这个孤独的实例等于加载的最后一行,并且您的列表显示每个项目的相同引用。

如问题下的评论所述,也许您也可以移动这些行

  bs.ResetBindings(false);
  listBox1.DataSource = bs;

循环外