我有一个DataTable,其中填充了其中一个是DateTime的值。我希望根据删除“spotTime”之前的任何内容的条件从此表中删除行。问题是它的动作似乎不一致,如果我打开VS调试器,我会收到一个错误,即字符串绑定无效。如果我尝试在调试模式下工作,程序只会因为该错误而关闭,并且永远不会到达catch语句。但是,在非调试模式下运行,似乎并不总是删除行。我尝试了一些方法,似乎没有正常工作。这是代码。这是一个每分钟发射一次的计时器。
public void ageTimer_Elapsed(object source, System.Timers.ElapsedEventArgs e)
{
try
{
spotAge = Convert.ToDouble(Properties.Settings.Default.SpotAge);
//Select all rows in datatable where the age is older than spotAge and delete them.
//date is stored in dt as 20:12:2017: 21:49:02 derived from DateTime.UtcNow.ToString("dd:MM:yyyy: HH:mm:ss")
//spotTime is the time from the table
DateTime spotTime;
for (int i = 0; i < dt.Rows.Count; i++)
{
spotTime = DateTime.ParseExact(Convert.ToString(dt.Rows[i]["date"]), "dd:MM:yyyy: HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
if (spotTime.AddMinutes(spotAge) <= DateTime.UtcNow)
{
dt.Rows[i].Delete();
}
else
{
break;
}
}
updateDisplay("");
}
catch (Exception x)
{
}
}
删除dt.Rows [i] .Delete()摆脱了错误,但当然我没有得到我需要的东西。我必须这样做不正确,但我似乎无法调试它。有什么建议?谢谢,汤姆
答案 0 :(得分:2)
当你在循环时尝试从中删除元素时,循环往往会变得非常麻烦。您可以尝试将计数转换为一个独立的整数,然后以 reverse 顺序执行循环,这样当您删除时,它不会对计数产生负面影响。例如:
int counter = dt.Rows.Count;
for (var i = counter-1; i >= 0; i--) {
... the rest of your code
}