Jump to content

Como resolver problema ao selecionar filhos no TreeView em C# com stackoverflowexception?


AlvaroLuiz

Postagens Recomendadas

Pessoal bom dia , estou com um problema para selecionar os filhos do meu treeview APENAS quando adiciono nivel 2 em diante.
Em anexo esta uma planilha com o resultado do meu select.

Aqui segue o meu preenchimento da treeview, tem até o nivel 4, más deixei comentado, pois estava testando para ver aonde dava o problema:

 

private void PreencheListaEntidade(string CnaeSelecionado = "")
{
TrvEntidade.Nodes.Clear();
DtEntidade = Entidade.MostraEntidade(CnaeSelecionado);
foreach (DataRow registro in DtEntidade.Rows)
{
string TextoPai = registro["razaosocial"].ToString();
string NomePai = registro["codentidade"].ToString();
TreeNode TPai = new TreeNode(TextoPai)
{
Name = NomePai,
Text = TextoPai,
Tag = registro["codentidade"].ToString()
};

string NomeFilho = NomePai + registro["codlancmunicipio"].ToString();
string TextoFilho = registro["municipio"].ToString();
TreeNode TFilho = new TreeNode(TextoFilho)
{
Name = NomeFilho,
Text = TextoFilho,
Tag = registro["codlancmunicipio"].ToString()
};

string NomeCnae = NomeFilho + registro["codcnaelancamento"].ToString();
string TextoCnae = registro["cnae"].ToString() + " - " + registro["descricao"].ToString();
TreeNode TCnae = new TreeNode(TextoCnae)
{
Name = NomeCnae,
Text = TextoCnae,
Tag = registro["codcnaelancamento"].ToString()
};

//// string NomeSubCnae = NomePai + registro["CodLancamentoCneSubGrupo"].ToString();
// string NomeSubCnae = registro["CodLancamentoCneSubGrupo"].ToString();
// string TextoSubCnae = registro["CodCnaeSubGrupo"].ToString() + " - " + registro["DescricaoSubGrupo"].ToString();
// TreeNode TSubCnae = new TreeNode(TextoSubCnae)
// {
// Name = NomeSubCnae,
// Text = TextoSubCnae
// };

TreeNode[] NoPai = TrvEntidade.Nodes.Find(NomePai, true);
if (NoPai.Length == 0) TrvEntidade.Nodes.Add(TPai);

TreeNode[] NoFilho = TrvEntidade.Nodes.Find(NomePai, true);
if (NoFilho.Length != 0 && TrvEntidade.Nodes.Find(NomeFilho, true).Length == 0) NoFilho[0].Nodes.Add(TFilho);

TreeNode[] NoCnae = TrvEntidade.Nodes.Find(NomeFilho, true);
if (NoCnae.Length != 0 && TrvEntidade.Nodes.Find(NomeCnae, true).Length == 0) NoCnae[0].Nodes.Add(TCnae);

//TreeNode[] NoSubCnae = TrvEntidade.Nodes.Find(NomeCnae, true);
//if (NoSubCnae.Length != 0 && TrvEntidade.Nodes.Find(NomeSubCnae, true).Length == 0 ) NoSubCnae[0].Nodes.Add(TSubCnae);
}
}



Aqui é a rotina para marcar / desmarcar:


private void TrvEntidade_AfterCheck(object sender, TreeViewEventArgs e)
{
if (Flag == false)
{
Flag = true;
MarcarFilhos(e.Node);
MarcarPais(e.Node);
Flag = false;
}
else
{
Flag = false;
}
}

private void MarcarFilhos(TreeNode NoSelecionado)
{
foreach (TreeNode item in NoSelecionado.Nodes)
{
//marcando ou desmarcando os filhos de acordo com o pai
item.Checked = NoSelecionado.Checked;// true;
MarcarFilhos(item);
}
}
private void MarcarPais(TreeNode NoSelecionado)
{
if (NoSelecionado.Parent != null)
{
if (NoSelecionado.Checked)
{
NoSelecionado.Parent.Checked = true; Aqui é onde fica parado com o erro - System.StackOverflowException
MarcarPais(NoSelecionado.Parent);
}
else
{
Boolean Continua = true;
foreach (TreeNode Irmao in NoSelecionado.Nodes)
{
if (Irmao.Checked == true)
{
Continua = false;
return;
}
}
if (Continua == true)
{
//verificar se tem filho ainda selecionado, para não tirar a seleção do pai
ExisteFilhoSelecionado = false;
foreach (TreeNode NoPai in NoSelecionado.Parent.Nodes)
{
if (NoPai.Checked == true) ExisteFilhoSelecionado = true;
}

if (ExisteFilhoSelecionado == false) NoSelecionado.Parent.Checked = false;
MarcarPais(NoSelecionado.Parent);
}
}
}
}

As tags dentro dos nós, eu criei na tentativa dele não se perder, más não deu certo, continuou com o mesmo problema

Agradeço desde já a ajuda de todos

Pasta1.xlsx

  • Curtir 1
Link to comment
Compartilhe em outros sites

  • Casa do Desenvolvedor mudou o título para Como resolver problema ao selecionar filhos no TreeView em C# com stackoverflowexception?

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora


×
×
  • Create New...