不应该为DataTable抛出RowNotInTableException?

时间:2015-05-08 16:57:16

标签: c# exception datatable

我不确定为什么会发生这种异常......如果我没有检查i < table.Rows.Count我能理解,但我确实检查了这个,所以我很困惑为什么行不在表格中......我在这里遇到了障碍,并且可以使用比我更有经验的人。我只是希望这是一个小小的愚蠢错误。

编辑:之前我有一个调试行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
        }
    }

2 个答案:

答案 0 :(得分:1)

我找到了解决方案。只是发布以防任何人有同样的问题。原始帖子中没有说明,但是这是通过DataTable上的更改/编辑事件调用的(由按钮点击触发并保存设置所需)。
问题是如果你试图在事件中获取属性,那么实际上是从表中拉出行(就像它被向上或向下移动一样)并且状态是“分离的”,因此,不再是正式在表格中。

要解决这个问题,我只是等待访问我的属性,直到事件完成后(因此行完全放回到表中),这需要对代码的其他部分进行一些修改。

希望这可以帮助有人继续前进!

答案 1 :(得分:0)

我还没有50名代表能够发表评论/提问,所以我的回答是基于我上面所看到的......

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

class _GhostLink(object):
    toGhost = lambda filename: False

class _Mod_AllowGhosting_All(_GhostLink):
    def _loop(self):
        # ...
        if self.__class__.toGhost(fileName) != oldGhost:...

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