【发布时间】:2021-06-22 12:03:01
【问题描述】:
我正在尝试从具有空单元格或空单元格的数据表中删除行,同时我检查列是否包含超过百分比的空单元格,如果是这种情况,我会删除整个列。我尝试这样进行:
private DataTable CleanData()
{
var dt = BindData(openFileDialog1.FileName);
for (var j = dt.Columns.Count-1; j >= 0; j--)
{
short count = 0;
for (var i = dt.Rows.Count - 1; i >= 0; i--)
{
if (!string.IsNullOrEmpty(dt.Rows[i][j].ToString())) continue;
count++;
}
var percentage = count * 100.0 / dt.Rows.Count;
if (percentage > 10)
{
dt.Columns.RemoveAt(j);
textFile.Text += " " + j + " ";
}
}
dt.AcceptChanges();
for (var j = dt.Columns.Count - 1; j >= 0; j--)
for (var i = dt.Rows.Count - 1; i >= 0; i--)
{
if (!string.IsNullOrEmpty(dt.Rows[i][j].ToString())) continue;
dt.Rows[i].Delete();
}
dt.AcceptChanges();
return dt;
}
我第一次循环遍历数据表单元格,然后检查一列中空单元格的百分比,如果超过 10%,我删除该列,然后我第二次循环,这次删除每一行有一个空的单元格,但在第二个循环中,当它到达已删除的列索引时,我收到一条错误消息 (System.Data.DeletedRowInaccessibleException),即使它应该在这些列不存在的数据表上循环。
任何线索我搞砸了?
编辑:我进行了建议的更改,但仍然遇到相同的错误
【问题讨论】:
-
您应该在循环内调用 AcceptChanges 或使用 Remove 而不是 Delete。
-
我无法用只有 3 列和 3 行的简单表格重现您的问题。但是,在行上的循环中存在错误。退出条件应该是 i >= 0 而不是 i > 0
-
从数组中删除时,总是从末尾开始并移到开头:for (var j = dt.Columns.Count - 1; j >= 0 ; j--)
-
对,但这无法解释与已删除行相关的异常。
-
@Crowcoder 我使用 delete 的部分工作正常(因为我从那里开始,然后我添加了检查列上 % 的循环。