我已经从2个不同的服务器填充了一个Datatable。我可以在我的长度> 0的情况下进行调整,我想要做的是删除未击中的行。以下是我的内容摘要
DataRow[] dr = payments.dtPayments.Select(myselect);
if (dr.Length > 0)
{
for (int a = 0; a < dr.Length; a++)
{
if (thisOption == true)
dr[0].Delete();
else if (otherOption == true)
{
dr[0]["Date"] = myDataReader["date"].ToString().Trim();
dr[0]["Pay"] = payTypeName(myDataReader["ccdsrc"].ToString()
.Trim());
}
}
}
if (dr.Length == 0)
{
if (LastOption == true)
{
//DataRow should be removed
}
}
答案 0 :(得分:18)
我不确定我是否完全理解您的问题但似乎您尝试在循环播放时从集合中删除条目。 (这将导致数组索引错误)
您应该在新集合中保存要删除的每个条目的引用,然后从旧集合中删除所有新条目:
DataRow[] dr = payments.dtPayments.Select(myselect);
List<DataRow> rowsToRemove = new List<DataRow>();
for (int a = 0; a < dr.Length; a++) {
if(/* You want to delete this row */) {
rowsToRemove.Add(dr[a]);
}
}
foreach(var dr in rowsToRemove) {
payments.dtPayments.Rows.Remove(dr);
}
答案 1 :(得分:4)
如果dr.Length为零,则您的选择不会返回任何行。如果要删除与您的条件不匹配的行,那么我会将其实现为不同类型的查询。也可能是我完全误解了你的问题。您是否可以更新您的问题以显示您的SQL并指出代码示例中您遇到问题的位置:在循环内部或循环之后您有注释?
答案 2 :(得分:2)
您需要在循环外创建一个数据行,然后当您到达要删除的行时,将其分配给您在外部创建的行。并打破循环。然后在循环下面你可以删除它。
DataRow r = null;
foreach(DataRow row in table.Rows)
{
if(condition==true)
{
r = row;
break;
}
}
table.Rows.Remove(r);
答案 3 :(得分:1)
你试过这个吗?
payments.dt Payments.Rows.Remove(dr)
答案 4 :(得分:1)
您可以反向循环遍历集合(对于(int i = rows.length-1; x&gt; -1; x--))以删除多行,以确保您不会获得索引超出绑定的错误。