在不应该为 DataTable 抛出 RowNotInTableException 时?

RowNotInTableException being thrown for DataTable when it shouldn't?

我不确定为什么会出现此异常...如果我没有检查 i < table.Rows.Count 我可以理解,但我会检查这个,所以我很困惑为什么该行是不在 table... 我在这里遇到了障碍,可以使用比我更有经验的人来解决这个问题。我只是希望这是那些愚蠢的小错误之一。

编辑:早些时候我有一个调试行 myTable.Rows[0]["FieldName"]myTable.Rows[1]["FieldName"]。第二个也抛出异常,第一个没有。

internal Collection<fieldDef> DefaultList
    {
        get
        {
            Collection<fieldDef> listFields = new Collection<fieldDef>();
            listFields.Clear();

            //Rows.Count is checked here, which is why I'm so confused...
            for (int i = 0; i < myTable.Rows.Count; i++)
            {
                string strFieldName = "";
                if (myTable.Rows[i]["FieldName"].ToString() != "")    //Exception happens here
                {
                    strFieldName = myTable.Rows[i]["FieldName"].ToString();
                }

                FieldType type = FieldType.Character;
                if (myTable.Rows[i]["FieldType"].ToString() != "") type = (FieldType)Enum.Parse(typeof(FieldType), myTable.Rows[i]["FieldType"].ToString());
                //
                //Other Similar lines to that above
                //
                fieldDef def = new fieldDef(i, strFieldName, strFieldName, type, /*other items...*/);
                listFields.Add(def);
            }
            return listFields;
        }
        set
        {
            //Nothing negative happens here, left out for simplicity
        }
    }

我还没有达到 50 个代表能够 comment/ask 问题,所以我的回答是基于我在上面看到的...

首先,如果您包含 error/exception 是什么,将会很有帮助。也就是说,虽然您可能有一行,但在调用该行中的 FieldName 字段时并没有检查是否为 null——您确定在该行的该字段中有一个非空值吗?如果它为空,调用 .ToString() 将抛出异常......我建议这样:

if (myTable.Rows[i]["FieldName"] != null && myTable.Rows[i]["FieldName"].ToString() != "")    //Exception happens here
{
    strFieldName = myTable.Rows[i]["FieldName"].ToString();
}

这可能是也可能不是您的问题,但无论哪种方式,在此处检查 null 都是一种很好的做法,有助于避免无效操作,例如尝试 null 实例。

我找到了解决方案。只是 posting 以防万一有人遇到同样的问题。它在原始 post 中没有说明,但它是通过 DataTable 上的 change/edit 事件调用的(由单击按钮触发并需要保存设置)。
问题是,如果您尝试在事件中获取 属性,该行实际上是从 table 中拉出的(就像向上或向下移动时一样)并且状态为 "detached",因此,不再正式在table。

为了解决这个问题,我只是等待访问我的 属性,直到事件完全结束(因此该行被完全放回 table),这需要对其他内容进行一些修改我的部分代码。

希望这对以后的人有所帮助!