从DataTable中删除行会导致“字符串绑定无效”

时间:2018-01-11 21:58:55

标签: c# datatable

我有一个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()摆脱了错误,但当然我没有得到我需要的东西。我必须这样做不正确,但我似乎无法调试它。有什么建议?谢谢,汤姆

1 个答案:

答案 0 :(得分:2)

当你在循环时尝试从中删除元素时,循环往往会变得非常麻烦。您可以尝试将计数转换为一个独立的整数,然后以 reverse 顺序执行循环,这样当您删除时,它不会对计数产生负面影响。例如:

int counter = dt.Rows.Count; for (var i = counter-1; i >= 0; i--) { ... the rest of your code }