第18位没有排

时间:2011-08-09 09:18:53

标签: c#

我正在从excel导入数据到sqlserver..i已经用excel表中的数据填充了数据集...现在iam操纵数据集中的数据,比如从sheet中删除空行。我编写了这段代码来消除空行但是它向我显示一个错误,“18位没有排。”而且空行的数量是11.这是代码片段:

    public DataSet GetExcelData()
    {
        DataTable ExcelTable = new DataTable();
        List<int> rowToRemove = new List<int>();
        //DataRow ExcelRow = new DataRow();

        foreach (DataRow excelrow in dsExcel.Tables[0].Rows)
        {
            bool IsEmpty = false;
            foreach (object item in excelrow.ItemArray)
            {
                if (String.IsNullOrEmpty(item.ToString())) 
                {
                     IsEmpty = true;
                     break;

                }                  
                else
                {
                    IsEmpty = false;

                }
            }
            if (IsEmpty)
            { 
                **rowToRemove.Add((dsExcel.Tables[0].Rows.IndexOf(excelrow)));**
            }

        }

        for (int i = 0; i < rowToRemove.Count; i++)
        {
            **dsExcel.Tables[0].Rows.RemoveAt(rowToRemove[i]);**
            //dsExcel.Tables[0].Rows.Remove(rowNumber); ; ;
        }
        return dsExcel;

    }

我在那边标记的线条我遇到了问题。没有采取适当的行。 我已经放置了一个断点,并且还检查了..以这种方式显示:

[0] 0

[1] 2

[2] 4

[3] 6

[4] 8

[5] 10

[6] 12

[7] 14

[8] 16

[9] 18

[10] 20

它正在计算从0位置开始的行...它根本不存在。并且它没有在22位置取空行。 请告诉我我需要做什么。

3 个答案:

答案 0 :(得分:4)

只要从列表中删除了第一项,就会关闭以下所有索引。 您可能希望先删除最后一个:

for (int i = rowToRemove.Count - 1; i >= 0; --i)
{
    dsExcel.Tables[0].Rows.RemoveAt(rowToRemove[i]);
}

答案 1 :(得分:0)

我认为这里的循环是问题

for (int i = 0; i < rowToRemove.Count; i++)
{
   **dsExcel.Tables[0].Rows.RemoveAt(rowToRemove[i]);**
   //dsExcel.Tables[0].Rows.Remove(rowNumber); ; ;
}

现在你继续删除索引搞砸了,所以一旦你删除/删除了一行索引重建并且你正在访问另一行,你就永远不会真正处于特定索引。 尝试从集合的最后开始

for (int i = rowToRemove.Count - 1; i >= 0; i--)
{
   dsExcel.Tables[0].Rows.RemoveAt(rowToRemove[i]);
       //dsExcel.Tables[0].Rows.Remove(rowNumber); ; ;
}

答案 2 :(得分:0)

另一种可能性是使用行本身而不是它们的索引:

public DataSet GetExcelData()
{
    DataTable ExcelTable = new DataTable();
    List<DataRow> rowToRemove = new List<DataRow>();

    foreach (DataRow excelrow in dsExcel.Tables[0].Rows)
    {
        foreach (object item in excelrow.ItemArray)
        {
            if (String.IsNullOrEmpty(item.ToString())) 
            {
                 rowToRemove.Add(excelRow);
                 break;
            }                  
        }
    }

    foreach (DataRow row in rowToRemove)
    {
        dsExcel.Tables[0].Rows.Remove(rowToRemove[i]);
    }
    return dsExcel;
}