在不应该为 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),这需要对其他内容进行一些修改我的部分代码。
希望这对以后的人有所帮助!
我不确定为什么会出现此异常...如果我没有检查 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),这需要对其他内容进行一些修改我的部分代码。
希望这对以后的人有所帮助!