Member 12721749 Ответов: 2

Outofrange exeption в treenode


Я получаю ошибку, когда пытаюсь петли через treeNodes.
Вот как выглядит мой код. Я хотел пропустить последний узел каждого дочернего узла.

var nodeList = inXmlNode.ChildNodes;
for (var x = 0; x <= nodeList.Count - 1; x++)
{
 var xNode = inXmlNode.ChildNodes[x];
 if (xNode.Attributes?["NAME"] != null && xNode.Attributes?["TYPE"] != null)
{

    var tNode2 = new TreeNode(xNode.Attributes["NAME"].Value, ObjectImageIndex, ObjectImageIndex);
    inTreeNode.Nodes.Add(tNode2);
    tNode2 = inTreeNode.Nodes[x]; // This is where the exception is thrown (x is 20) but inTreeNode.Nodes only has 1
    AddNode(xNode, tNode2);
}
else
{
    var xmlAttribute = xNode.Attributes?["Name"];
    if (xmlAttribute == null) continue;
    var tNode = new TreeNode(xmlAttribute.Value);
    //inTreeNode.Nodes.Add(tNode);  //BECAUSE I WANT TO SKIP THE LAST CHILD OF EACH NODE
    //tNode = inTreeNode.Nodes[x];
    //AddNode(xNode, tNode);
}
}


Что я уже пробовал:

Я пробовал устанавливать уровень и проверять наличие дочерних узлов

Philippe Mori

Научитесь использовать отладчик... Если вы получили исключение в пункте 20, то, вероятно, выполнили else часть итерации непосредственно перед тем, как и так как узел не добавляется в этом случае, у вас есть один узел меньше, чем текущий x на следующей итерации.

2 Ответов

Рейтинг:
2

Patrice T

Проблема в том, что x включен ли счетчик nodeList но вы также используете его на inTreeNode.Nodes а это совсем другое.
Вы должны переосмыслить свои намерения.

Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
1

BillWoodruff

Во-первых, трудность может быть здесь:

var tNode2 = new TreeNode(xNode.Attributes["NAME"].Value, ObjectImageIndex, ObjectImageIndex);
inTreeNode.Nodes.Add(tNode2);
tNode2 = inTreeNode.Nodes[x]; // why are you doing this ? ?
AddNode(xNode, tNode2);
Вы создаете новый TreeNode, добавляете его в коллекцию, а затем повторно назначаете его текущему "слоту", на который указывает индексированное значение в той же коллекции. Почему бы тебе просто не пройти 'tNode2 непосредственно в добавление узла ?

И, возможно, добавьте какой-нибудь код, который проверяет, что свойства Count коллекции inXmlNode и коллекции inTreeNode допустимы для всех возможных значений x.
var inXmlNodes = inXmlNode.ChildNodes;
int xmlNodeCount = inXmlNodes.Count();

var inTreeNodes = inTreeNode.Nodes;
if(inTreeNode.Count < xmlNodeCount { // throw an error }
Если это вам не поможет, то поставьте точку останова непосредственно перед вызовом 'AddNode и следуйте по пути выполнения, когда эта точка останова будет достигнута.