【发布时间】:2011-04-21 06:52:03
【问题描述】:
我的 Windows 窗体应用程序中有一个带有复选框的树视图控件。如何在选择或取消选择其父节点时自动选择或取消选择所有子节点?
【问题讨论】:
我的 Windows 窗体应用程序中有一个带有复选框的树视图控件。如何在选择或取消选择其父节点时自动选择或取消选择所有子节点?
【问题讨论】:
如果我没记错的话,AfterCheck 事件文档中的示例代码正是您想要的。
【讨论】:
private void HandleOnTreeViewAfterCheck(Object sender,
TreeViewEventArgs e)
{
CheckTreeViewNode(e.Node, e.Node.Checked);
}
private void CheckTreeViewNode(TreeNode node, Boolean isChecked)
{
foreach (TreeNode item in node.Nodes)
{
item.Checked = isChecked;
if (item.Nodes.Count > 0)
{
this.CheckTreeViewNode(item, isChecked);
}
}
}
【讨论】:
if(e.Action != TreeViewAction.Unknown)
请在下面找到工作代码。我在我的应用程序中使用它。希望这能解决问题。
private void tree_Documents_AfterCheck(object sender, TreeViewEventArgs e)
{
TreeNode checkedNode = e.Node;
foreach (TreeNode node in checkedNode.Nodes)
{
node.Checked = checkedNode.Checked;
}
}
【讨论】:
checkedNode 的孙子。
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 treeView_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Action != TreeViewAction.Unknown)
{
if (e.Node.Nodes.Count > 0)
{
if (!e.Node.Checked)
{
this.CheckAllChildNodes(e.Node, e.Node.Checked);
}
}
}
if (e.Node.Parent != null)
{
TreeNode n = e.Node;
while (n.Parent != null)
{
if (n.Checked)
{
n.Parent.Checked = true;
}
n = n.Parent;
}
}
}
【讨论】:
//TreeView - myTreeview;
myTreeview.BeginUpdate();
//Loop through all the nodes of tree
foreach (TreeNode node in myTreeview.Nodes)
{
//If node has child nodes
if (HasChildNodes(node))
{
if (node.Checked == true)
{
//Check all the child nodes.
foreach (TreeNode childNode in node.Nodes)
{
childNode.Checked = true;
}
}
}
}
myTreeview.EndUpdate();
Hope this helps....
【讨论】:
使用树视图的 AfterCheck 事件对树视图内的子节点应该发生的情况进行编码。
将树视图节点的相同状态也传递给其子节点,并将其“checked”属性设置为树视图节点的相同状态。
【讨论】:
这个简单的代码对我有用
private void treeView_AfterCheck(object sender, TreeViewEventArgs e) {
try {
e.Node.TreeView.BeginUpdate();
if (e.Node.Nodes.Count > 0) {
var parentNode = e.Node;
var nodes = e.Node.Nodes;
CheckedOrUnCheckedNodes(parentNode, nodes);
}
} finally {
e.Node.TreeView.EndUpdate();
}
}
private void CheckedOrUnCheckedNodes(TreeNode parentNode, TreeNodeCollection nodes) {
if (nodes.Count > 0) {
foreach (TreeNode node in nodes) {
node.Checked = parentNode.Checked;
CheckedOrUnCheckedNodes(parentNode, node.Nodes);
}
}
}
【讨论】:
If Not TreeView1.Nodes(e.Node.Text) Is Nothing Then
For Each node As TreeNode In TreeView1.Nodes(e.Node.Text).Nodes
If node.Parent.Checked = True Then
node.Checked = True
End If
If node.Parent.Checked = False Then
node.Checked = False
End If
Next
End If
【讨论】:
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Node.Nodes.Count != 0)
{
if (e.Node.Checked)
{
CheckAllChildNodes1(e.Node);
}
else
{
UncheckChildNodes1(e.Node);
}
}
}
private void CheckAllChildNodes1(TreeNode treeNodeAdv)
{
foreach (TreeNode nd in treeNodeAdv.Nodes)
{
nd.Checked = treeNodeAdv.Checked;
}
}
private void UncheckChildNodes1(TreeNode treeNodeAdv)
{
foreach (TreeNode nd in treeNodeAdv.Nodes)
{
nd.Checked = treeNodeAdv.Checked;
}
}
【讨论】:
试试这个代码,这用于检查和取消选中父节点以及点击子节点。
private void CheckTreeViewNode(TreeNode node, Boolean isChecked)
{
foreach (TreeNode item in node.Nodes)
{
item.Checked = isChecked;
if (item.Nodes.Count > 0)
{
this.CheckTreeViewNode(item, isChecked);
}
}
if (isChecked && node.Parent != null)
{
treeView1.AfterCheck -= HandleOnTreeViewAfterCheck;
node.Parent.Checked = true;
treeView1.AfterCheck += HandleOnTreeViewAfterCheck;
}
if (!isChecked && node.Parent != null)
{
bool unchk = true;
treeView1.AfterCheck -= HandleOnTreeViewAfterCheck;
foreach (TreeNode item in node.Parent.Nodes)
{
if (item.Checked)
{
unchk = false;
break;
}
}
if (unchk)
node.Parent.Checked = false;
treeView1.AfterCheck += HandleOnTreeViewAfterCheck;
}
}
【讨论】: