-1

I'm really lost trying to build a dynamically TreeView on WinForm. I already look for some questions in other forums and here but none help me out of this situation.

So, I have a Treeview running. But when I try to implement the 5 child nodes, I get the OutOfRangeException.

This is the way my code run but it's not what I want.

listaDeInstrucoes.Nodes.Add(NomeInstrucao);

The way I want for my code is this (In the line with a comment)

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

Then the Exception occurred. :(

Follow my code:

    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);
            }
        }
    }
  • [How do I ask a good question?](http://stackoverflow.com/help/how-to-ask) – Reza Aghaei Dec 17 '15 at 20:33
  • Now that the format has been changed, I think it will be best if you can copy the place where you get the error + a couple of lines before and then gives a little indicator in your code such as by comment //this is where I get the error of [ErrorName]!. The line number 114 might not help much anymore... – Ian Dec 18 '15 at 04:50
  • Ok, done. I removed the unnecessary comments and added new lines in place where i get the error. – Fábio Carvalho Dec 18 '15 at 10:31

1 Answers1

1

Does your TreeNode contain child nodes? If you debug it, what is the result? Also, what is the value of posicaoNodo? I always add an if statement just for security. E.g.

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

This if statement makes sure that your TreeNode (listaDeInformacaoNode) contains child nodes. Add this everywhere you get the exception, then you're sure you won't have any OutOfRangeException.

roemel
  • 3,247
  • 4
  • 29
  • 52