C# 函数返回一个空的DataTable,但我可以看到正在导入的“单个”元素

C# 函数返回一个空的DataTable,但我可以看到正在导入的“单个”元素,c#,arrays,string,C#,Arrays,String,我在C中的一个函数上遇到了几个小时的麻烦。基本上,我想用一个文件调用一个函数,在本例中是一个.csv文件;分隔列,并将.csv文件中包含的数据作为DataTable返回,但包含标题的第一行除外。为此,我尝试过: private DataTable getDataTable(string file) { DataTable tbl = new DataTable("Order_proposal_Internal_External"); tbl.Columns.Add(new Dat

我在C中的一个函数上遇到了几个小时的麻烦。基本上,我想用一个文件调用一个函数,在本例中是一个.csv文件;分隔列,并将.csv文件中包含的数据作为DataTable返回,但包含标题的第一行除外。为此,我尝试过:

private DataTable getDataTable(string file)
{
    DataTable tbl = new DataTable("Order_proposal_Internal_External");
    tbl.Columns.Add(new DataColumn("FileName"));
    tbl.Columns.Add(new DataColumn("Supplier"));
    tbl.Columns.Add(new DataColumn("Store"));
    tbl.Columns.Add(new DataColumn("Item"));
    tbl.Columns.Add(new DataColumn("Quantity"));
    tbl.Columns.Add(new DataColumn("Delivery_Date"));  

    string[] lines = System.IO.File.ReadAllLines(file);
    lines = lines.Skip(1).ToArray();

    foreach (string line in lines)
    {
        var cols = line.Split(';');

        if (cols.Length == 1)
            continue;

        DataRow dr = tbl.NewRow();

        dr[0] = file;

        for (int cIndex = 1; cIndex + 1 < tbl.Columns.Count; cIndex++)
        {
            dr[cIndex + 1] = cols[cIndex];
            MessageBox.Show(cols[cIndex]);
        }
    }
    return tbl;
}
当我运行程序时,它在第5点打印失败

用作函数参数的.csv文件具有以下外观:

supplier;store;item;quantity;delivery_date
13;1;411;12.0;20170322
80;1;415;3.0;20170322
有人知道我没有掌握什么吗?

tbl.NewRow创建新的TableRow对象,但不将其添加到表的Rows集合中。它完全按照罐头上说的做,不再做了。将其添加到行是一个单独的方法调用

    DataRow dr = tbl.NewRow();

    dr[0] = file;

    for (int cIndex = 1; cIndex + 1 < tbl.Columns.Count; cIndex++)
    {
        dr[cIndex + 1] = cols[cIndex];
    }

    //  Now that it's populated, add it to the table. 
    tb.Rows.Add(dr);
NewRow创建新的TableRow对象,但不将其添加到表的Rows集合中。它完全按照罐头上说的做,不再做了。将其添加到行是一个单独的方法调用

    DataRow dr = tbl.NewRow();

    dr[0] = file;

    for (int cIndex = 1; cIndex + 1 < tbl.Columns.Count; cIndex++)
    {
        dr[cIndex + 1] = cols[cIndex];
    }

    //  Now that it's populated, add it to the table. 
    tb.Rows.Add(dr);

您缺少将行添加到DataTable.Rows集合的调用,仅创建DataRow不会将其添加到Rows集合,并且您的表仍为空

DataRow dr = tbl.NewRow();
dr[0] = file;
for (int cIndex = 1; cIndex + 1 < tbl.Columns.Count; cIndex++)
{
    dr[cIndex + 1] = cols[cIndex];
    MessageBox.Show(cols[cIndex]);
}
tbl.Rows.Add(dr);   // < this one is needed
在这里,循环开始设置从索引2存储的列加载的值,跳过索引1存储的列

dr[cIndex] = cols[cIndex-1];
请注意,供应商代码拆分字符串中的第一个元素位于索引0处,因此您应该从cIndex-1中读取

此外,for..循环的结束条件不正确。在CSV文件中有5列,在表中有6列。循环应该与

for (int cIndex = 1; cIndex < tbl.Columns.Count; cIndex++)
{
   dr[cIndex] = cols[cIndex-1];
   ....
}

您缺少将行添加到DataTable.Rows集合的调用,仅创建DataRow不会将其添加到Rows集合,并且您的表仍为空

DataRow dr = tbl.NewRow();
dr[0] = file;
for (int cIndex = 1; cIndex + 1 < tbl.Columns.Count; cIndex++)
{
    dr[cIndex + 1] = cols[cIndex];
    MessageBox.Show(cols[cIndex]);
}
tbl.Rows.Add(dr);   // < this one is needed
在这里,循环开始设置从索引2存储的列加载的值,跳过索引1存储的列

dr[cIndex] = cols[cIndex-1];
请注意,供应商代码拆分字符串中的第一个元素位于索引0处,因此您应该从cIndex-1中读取

此外,for..循环的结束条件不正确。在CSV文件中有5列,在表中有6列。循环应该与

for (int cIndex = 1; cIndex < tbl.Columns.Count; cIndex++)
{
   dr[cIndex] = cols[cIndex-1];
   ....
}

您需要将该行添加到DataTable中。在DataTable对象上调用NewRow方法时,它正在创建一个具有与行定义匹配的模式的行,但实际上它并没有添加到其内部集合中

        tbl.Rows.Add(dr);

您需要将该行添加到DataTable中。在DataTable对象上调用NewRow方法时,它正在创建一个具有与行定义匹配的模式的行,但实际上它并没有添加到其内部集合中

        tbl.Rows.Add(dr);

添加tbl.Rows.Adddr;在foreach循环中,我得到了一个错误,System.Data.dll中发生了“System.ArgumentException”类型的异常,但在指向该行的“用户代码”中没有处理。如果我将错误解释为正确的,那么数据类型似乎有问题?在阅读本文和执行脚本之前,我测试了它。现在我开始下一个错误!谢谢你的帮助!添加tbl.Rows.Adddr;在foreach循环中,我得到了一个错误,System.Data.dll中发生了“System.ArgumentException”类型的异常,但在指向该行的“用户代码”中没有处理。如果我将错误解释为正确的,那么数据类型似乎有问题?在阅读本文和执行脚本之前,我测试了它。现在我开始下一个错误!谢谢你的帮助!