TREEVIEW NODES NIVEL ANTERIOR CHECK/UNCHEK

MARSOLIM 19/09/2014 12:51:02
#441361
pessoas estou com um problema para marcar o nível anterior de uma treeview quando pelo menos um nível child estiver marcado e desmarcar quando nenhum child estiver marcado. ve o exemplo abaixo

avô 0
pai 0
filho 0
filho 1
filho 2
pai 1
filho 0
filho 1
filho 2
filho 3
filho 4
pai 2
filho 0
filho 1
filho 2
filho 3


o que eu quero é se eu marcar ou desmarcar um dos filhos verificar se pelo menos um desses filhos está marcado. se tiver marca o pai dele e se nenhum estiver marcado desmarca o pai dele.

tentei usar o evento aftercheck da treeview mas ele dá erro. eu uso esse evento para marcar e desmarcar os filhos quando o pai é marcado ou desmarcado mas o contrário não funciona. o que eu fiz então foi usar o botão que dispara o evento aonde vou precisar dessa verificação para verificar isso antes de disparar o evento dele mas eu queria uma forma de fazer isso ao marcar e desmarcar um filho. estou usando a sub abaixo para isso

        Dim n_nodes As Boolean = False

For n_nivel_um As Integer = 0 To Me.TreeView1.Nodes(0).Nodes.Count - 1

For n_nivel_dois As Integer = 0 To Me.TreeView1.Nodes(0).Nodes(n_nivel_um).Nodes.Count - 1
If Me.TreeView1.Nodes(0).Nodes(n_nivel_um).Nodes(n_nivel_dois).Checked = True Then
n_nodes = True
End If
Next

If n_nodes = True Then
Me.TreeView1.Nodes(0).Nodes(n_nivel_um).Checked = True
Else
Me.TreeView1.Nodes(0).Nodes(n_nivel_um).Checked = False
End If

n_nodes = False

Next


muito agradeço a ajuda.
LENDAURBANA 22/09/2014 14:59:13
#441423
Tá ai a logica em C#......

#region TreeView


private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
{
foreach (TreeNode node in treeNode.Nodes)
{
node.Checked = nodeChecked;
if (node.Nodes.Count > 0)
{
this.CheckAllChildNodes(node, nodeChecked);
}
}
}


private void CheckAllParentNodes(TreeNode treeNode, bool nodeChecked)
{

if (treeNode.Parent != null)
{
bool moreCheckd = false;
foreach (TreeNode node in treeNode.Parent.Nodes)
{
if (treeNode != node)
{
if (node.Checked)
{
moreCheckd = true;
}
}
}

if (!moreCheckd)
{
treeNode.Parent.Checked = nodeChecked;
CheckAllParentNodes(treeNode.Parent, nodeChecked);
}

}

}

private void twAcesso_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Action != TreeViewAction.Unknown)
{
if (e.Node.Nodes.Count > 0)
{
this.CheckAllChildNodes(e.Node, e.Node.Checked);
}

this.CheckAllParentNodes(e.Node, e.Node.Checked);

}
}

private void getChildNodes(ToolStripDropDownItem mi, TreeNode tn)
{
foreach (object item in mi.DropDownItems)
{
if (item.GetType() == typeof(ToolStripSeparator))
{
continue;
}
TreeNode node = new TreeNode(((ToolStripDropDownItem)item).Text);
node.Tag = ((ToolStripDropDownItem)item).Name;
node.Name = ((ToolStripDropDownItem)item).Name;


tn.Nodes.Add(node);
getChildNodes(((ToolStripDropDownItem)item), node);
}
}


#endregion
Tópico encerrado , respostas não são mais permitidas