'Проверено = Истина', исключение - PullRequest
0 голосов
/ 31 мая 2018

перебирает некоторые узлы флажка в древовидном списке и пытается установить для некоторых дочерних узлов значение true.когда я пытаюсь установить один, истина или ложь, это вызывает исключение.

'childNode.Checked' threw an exception of type 'System.NullReferenceException'

Мне не хватает чего-то очевидного?

спасибо

private void FluidFilterTree_AfterCheck(object sender, TreeViewEventArgs e)
    {
        TreeNode ActiveNode = e.Node;
        TreeNode childNode = ActiveNode.FirstNode;
        if (ActiveNode.Parent == null) // if null it is the parent, check all children
        {
            for (int x = 0; x < ActiveNode.GetNodeCount(false); x++) // loop through children nodes
            {
                childNode.Checked = false; //?

                childNode = childNode.NextNode;
            }
        }

        MessageBox.Show(e.Node.Text);
    }

Объект childNode установлен и работает, у меня есть точка останова на линии, и она работает, пока не попытается установить .checked = true.Поэтому я не уверен, что это дубликат стандарта «что означает это исключение». Я понимаю исключение, но не уверен, почему оно имеет значение в данном случае, поскольку я знаю, что childNode и true существуют

Точка останова доизменение checked imagechecked">

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Согласитесь с Терри Карменом, вы полагаете, что childNode никогда не будет нулевым.Но, как вы можете видеть, что NullReferenceException брошено, это не так.Как насчет этого, более безопасного примера:

private void FluidFilterTree_AfterCheck(object sender, TreeViewEventArgs e)
{
    var activeNode = e.Node;
    if (activeNode.Parent == null)
        foreach (TreeNode child in activeNode.Nodes)
            child.Checked = false;

    MessageBox.Show(e.Node.Text);
}
0 голосов
/ 31 мая 2018

Ответ кажется действительно очевидным.Когда код выполнялся, а childNode.checked изменялся, он затем вызывал функцию, которая должна быть запущена снова, на этот раз на обновленном узле, так как это обновление будет вызывать событие afterchecked.

Оборачивание в

if (e.Action.ToString() == "ByMouse")
{
    // code here
}

, кажется, работает и не позволяет вызывать его несколько раз.

0 голосов
/ 31 мая 2018

Вы предполагаете, что у ActiveNode есть дети.

Это не обязательно так.Если дочерних элементов нет, ActiveNode.FirstNode имеет значение null, и вы не можете ссылаться на свойство Checked.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...