【发布时间】: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