【问题标题】:Out of Range TreeNode C# Windows Forms When set position count超出范围 TreeNode C# Windows 窗体设置位置计数时
【发布时间】:2015-12-17 19:53:53
【问题描述】:

WinForm 上动态构建TreeView 时,我真的很迷茫。我已经在其他论坛和这里寻找了一些问题,但没有一个能帮助我摆脱这种情况。

所以,我有一个 Treeview 正在运行。但是当我尝试实现 5 个子节点时,我得到了OutOfRangeException

这是我的代码运行的方式,但这不是我想要的。

listaDeInstrucoes.Nodes.Add(NomeInstrucao);

我想要的代码方式是这样的(在带有注释的行中)

listaDeInstrucoes.Nodes[posicaoAuxiliar].Nodes.Add(NomeInstrucao);

然后Exception 发生了。 :(

按照我的代码:

    using ProjetoXML;
    using ProjetoXML.Enums;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;

    namespace ConfiguradorAutonav
    {
        class NavegacaoConfigurador 
        {    
            public TreeView TreeNavegacaoConfigurador = new TreeView();    
            public NavegacaoConfigurador() 
            {
                TreeNavegacaoConfigurador.Dock = System.Windows.Forms.DockStyle.Fill;
                menuLocal();
            }

            private void menuLocal() 
            {
                clsLocal local = new clsLocal();
                int posicaoNodo = 0;        
                TreeNode LocalNode = new TreeNode();

                LocalNode.Name = "localNode";
                LocalNode.Text = "Local";

                TreeNode DispositivoNode = new TreeNode();
                DispositivoNode.Name = "dispositivoNode";
                DispositivoNode.Text = "Dispositivo";

                TreeNavegacaoConfigurador.Nodes.Add(LocalNode);
                TreeNavegacaoConfigurador.Nodes[posicaoNodo].Nodes.Add(DispositivoNode);

                local.ListaDeDispositivos.Add(new clsDispositivo() { Nome = "Fábio" });
                local.ListaDeDispositivos.Add(new clsDispositivo() { Nome = "Henrique" });


                local.ListaDeDispositivos.ForEach(novoDispositivo => AtualizaListaDeDispositivo(novoDispositivo,ref posicaoNodo, DispositivoNode));    
            }

            private void AtualizaListaDeDispositivo(clsDispositivo novoDispositivo,ref int posicaoNodo, TreeNode DispositivoNode)
            {
                int posicaoAuxiliar = posicaoNodo;

                TreeNode NomeDispositivo = new TreeNode();
                TreeNode DescricaoDispositivo = new TreeNode();
                TreeNode identificadorDispositivo = new TreeNode();
                TreeNode MemoriaDispositivo = new TreeNode();
                TreeNode VersaoDispostivo = new TreeNode();

                NomeDispositivo.Text = novoDispositivo.Nome;
                DescricaoDispositivo.Text = novoDispositivo.VersaoProtocoloAutonav.ToString();
                identificadorDispositivo.Text = novoDispositivo.ITD;
                MemoriaDispositivo.Text = novoDispositivo.MemoriaPrograma.ToString();
                VersaoDispostivo.Text = novoDispositivo.VersaoProtocoloAutonav.ToString();

                TreeNode listaDeInformacaoNode = new TreeNode();
                listaDeInformacaoNode.Text = "Lista de Informações";

                TreeNode listaDeInstrucoes = new TreeNode();
                listaDeInstrucoes.Text = "Lista de Instruções";

                DispositivoNode.Nodes.Add(NomeDispositivo);
                DispositivoNode.Nodes[posicaoNodo].Nodes.Add(VersaoDispostivo);
                DispositivoNode.Nodes[posicaoNodo].Nodes.Add(identificadorDispositivo);
                DispositivoNode.Nodes[posicaoNodo].Nodes.Add(MemoriaDispositivo);
                DispositivoNode.Nodes[posicaoNodo].Nodes.Add(DescricaoDispositivo);
                DispositivoNode.Nodes[posicaoNodo].Nodes.Add(listaDeInformacaoNode);
                DispositivoNode.Nodes[posicaoNodo].Nodes.Add(listaDeInstrucoes);

                novoDispositivo.ListaDeInformacoes = new List<clsInformacao>();
                novoDispositivo.ListaDeInstrucoes = new List<clsInstrucao>();


                novoDispositivo.ListaDeInformacoes.Add(new clsInformacao() { Campo = "True", TipoDado = ETipoDado.Byte });
                novoDispositivo.ListaDeInstrucoes.Add(new clsInstrucao() { Descricao = "Está é uma descrição" });

                novoDispositivo.ListaDeInformacoes.ForEach(novaInformacao => AtualizaListaDeInformacao(novaInformacao, listaDeInformacaoNode, posicaoAuxiliar));
                novoDispositivo.ListaDeInstrucoes.ForEach(novaInstrucao => AtualizaListaDeInstrucoes(novaInstrucao, listaDeInstrucoes, posicaoAuxiliar));

                posicaoNodo++;
            }

            private void AtualizaListaDeInstrucoes(clsInstrucao novaInstrucao, TreeNode listaDeInstrucoes,int posicaoAuxiliar)
            {
                TreeNode NomeInstrucao = new TreeNode();
                TreeNode DescricaoInstrucao = new TreeNode();

                TreeNode ListaOperandoInstrucao = new TreeNode();
                ListaOperandoInstrucao.Text = "Lista de Operandos";

                NomeInstrucao.Text = novaInstrucao.Nome;
                DescricaoInstrucao.Text = novaInstrucao.Descricao;        


//Here is where i get the error.
//ERROR Message: Out of Range Exception
            listaDeInstrucoes.Nodes[posicaoAuxiliar].Nodes.Add(NomeInstrucao);
                listaDeInstrucoes.Nodes[posicaoAuxiliar].Nodes.Add(DescricaoInstrucao);
                listaDeInstrucoes.Nodes[posicaoAuxiliar].Nodes.Add(ListaOperandoInstrucao);

                novaInstrucao.ListaDeOperando = new List<clsOperando>();

                novaInstrucao.ListaDeOperando.Add(new clsOperando() { Descricao = "Este é um operando"});
                novaInstrucao.ListaDeOperando.Add(new clsOperando() { Descricao = "Este é um operando 2" });
            }

            private void AtualizaListaDeInformacao(clsInformacao novaListaDeInformacao, TreeNode listaDeInformacaoNode,
                int posicaoNodo)
            {
                TreeNode CampoInformacao = new TreeNode();
                TreeNode TipoDeDadoInformacao = new TreeNode();
                TreeNode ValorInformacao = new TreeNode();

                CampoInformacao.Text = novaListaDeInformacao.Campo;
                ValorInformacao.Text = novaListaDeInformacao.Valor;
                TipoDeDadoInformacao.Text = novaListaDeInformacao.TipoDado.ToString();

//Same error here
//Out of Range Exception
                listaDeInformacaoNode.Nodes[posicaoNodo].Nodes.Add(CampoInformacao);
                listaDeInformacaoNode.Nodes[posicaoNodo].Nodes.Add(ValorInformacao);
                listaDeInformacaoNode.Nodes[posicaoNodo].Nodes.Add(TipoDeDadoInformacao);
            }
        }
    }

【问题讨论】:

  • 现在格式已经改变了,我认为如果你可以复制你得到错误的地方+之前的几行,然后在你的代码中给出一个小指标,比如通过评论 //这是我得到 [ErrorName] 错误的地方!。行号 114 可能不再有多大帮助...
  • 好的,完成。我删除了不必要的 cmets 并在出现错误的地方添加了新行。

标签: c# winforms treeview treenode


【解决方案1】:

您的TreeNode 是否包含子节点?如果调试它,结果是什么?另外,posicaoNodo 的值是多少?为了安全起见,我总是添加一个 if 语句。例如

if(listaDeInformacaoNode.Nodes.Count >= posicaoNodo)
{
    listaDeInformacaoNode.Nodes[posicaoNodo].Nodes.Add(CampoInformacao);
    listaDeInformacaoNode.Nodes[posicaoNodo].Nodes.Add(ValorInformacao);
    listaDeInformacaoNode.Nodes[posicaoNodo].Nodes.Add(TipoDeDadoInformacao);
}

此 if 语句确保您的 TreeNode (listaDeInformacaoNode) 包含子节点。在你得到异常的任何地方添加这个,然后你确定你不会有任何OutOfRangeException

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多