public:
property bool CheckBoxes { bool get(); void set(bool value); };
public bool CheckBoxes { get; set; }
member this.CheckBoxes : bool with get, set
Public Property CheckBoxes As Boolean
下面的代码示例演示如何更改折叠状态
TreeView
,以便所有检查的节点可见。 首先,所有节点都折叠,并为事件
BeforeExpand
添加处理程序。 接下来,所有节点都会展开。
BeforeExpand
事件处理程序确定给定节点是否具有已检查的子节点。 如果节点没有检查子节点,则会取消该节点的扩展。 若要在单击节点旁边的加号时允许标准节点扩展,
BeforeExpand
则删除事件处理程序。
还可以通过处理
BeforeCollapse
事件来实现此行为,如该主题的示例所示。
#using <System.dll>
#using <System.Windows.Forms.dll>
#using <System.Drawing.dll>
using namespace System;
using namespace System::Drawing;
using namespace System::Windows::Forms;
public ref class Form1: public Form
private:
TreeView^ treeView1;
Button^ showCheckedNodesButton;
TreeViewCancelEventHandler^ checkForCheckedChildren;
public:
Form1()
treeView1 = gcnew TreeView;
showCheckedNodesButton = gcnew Button;
checkForCheckedChildren = gcnew TreeViewCancelEventHandler( this, &Form1::CheckForCheckedChildrenHandler );
this->SuspendLayout();
// Initialize treeView1.
treeView1->Location = Point(0,25);
treeView1->Size = System::Drawing::Size( 292, 248 );
treeView1->Anchor = static_cast<AnchorStyles>(AnchorStyles::Top | AnchorStyles::Left | AnchorStyles::Bottom | AnchorStyles::Right);
treeView1->CheckBoxes = true;
// Add nodes to treeView1.
TreeNode^ node;
for ( int x = 0; x < 3; ++x )
// Add a root node.
node = treeView1->Nodes->Add( String::Format( "Node{0}", x * 4 ) );
for ( int y = 1; y < 4; ++y )
// Add a node as a child of the previously added node.
node = node->Nodes->Add( String::Format( "Node{0}", x * 4 + y ) );
// Set the checked state of one of the nodes to
// demonstrate the showCheckedNodesButton button behavior.
treeView1->Nodes[ 1 ]->Nodes[ 0 ]->Nodes[ 0 ]->Checked = true;
// Initialize showCheckedNodesButton.
showCheckedNodesButton->Size = System::Drawing::Size( 144, 24 );
showCheckedNodesButton->Text = "Show Checked Nodes";
showCheckedNodesButton->Click += gcnew EventHandler( this, &Form1::showCheckedNodesButton_Click );
// Initialize the form.
this->ClientSize = System::Drawing::Size( 292, 273 );
array<Control^>^temp0 = {showCheckedNodesButton,treeView1};
this->Controls->AddRange( temp0 );
this->ResumeLayout( false );
private:
void showCheckedNodesButton_Click( Object^ /*sender*/, EventArgs^ /*e*/ )
// Disable redrawing of treeView1 to prevent flickering
// while changes are made.
treeView1->BeginUpdate();
// Collapse all nodes of treeView1.
treeView1->CollapseAll();
// Add the checkForCheckedChildren event handler to the BeforeExpand event.
treeView1->BeforeExpand += checkForCheckedChildren;
// Expand all nodes of treeView1. Nodes without checked children are
// prevented from expanding by the checkForCheckedChildren event handler.
treeView1->ExpandAll();
// Remove the checkForCheckedChildren event handler from the BeforeExpand
// event so manual node expansion will work correctly.
treeView1->BeforeExpand -= checkForCheckedChildren;
// Enable redrawing of treeView1.
treeView1->EndUpdate();
// Prevent expansion of a node that does not have any checked child nodes.
void CheckForCheckedChildrenHandler( Object^ /*sender*/, TreeViewCancelEventArgs^ e )
if ( !HasCheckedChildNodes( e->Node ) )
e->Cancel = true;
// Returns a value indicating whether the specified
// TreeNode has checked child nodes.
bool HasCheckedChildNodes( TreeNode^ node )
if ( node->Nodes->Count == 0 )
return false;
System::Collections::IEnumerator^ myEnum = node->Nodes->GetEnumerator();
while ( myEnum->MoveNext() )
TreeNode^ childNode = safe_cast<TreeNode^>(myEnum->Current);
if ( childNode->Checked )
return true;
// Recursively check the children of the current child node.
if ( HasCheckedChildNodes( childNode ) )
return true;
return false;
int main()
Application::Run( gcnew Form1 );
using System;
using System.Drawing;
using System.Windows.Forms;
public class Form1 : Form
private TreeView treeView1;
private Button showCheckedNodesButton;
private TreeViewCancelEventHandler checkForCheckedChildren;
public Form1()
treeView1 = new TreeView();
showCheckedNodesButton = new Button();
checkForCheckedChildren =
new TreeViewCancelEventHandler(CheckForCheckedChildrenHandler);
this.SuspendLayout();
// Initialize treeView1.
treeView1.Location = new Point(0, 25);
treeView1.Size = new Size(292, 248);
treeView1.Anchor = AnchorStyles.Top | AnchorStyles.Left |
AnchorStyles.Bottom | AnchorStyles.Right;
treeView1.CheckBoxes = true;
// Add nodes to treeView1.
TreeNode node;
for (int x = 0; x < 3; ++x)
// Add a root node.
node = treeView1.Nodes.Add(String.Format("Node{0}", x*4));
for (int y = 1; y < 4; ++y)
// Add a node as a child of the previously added node.
node = node.Nodes.Add(String.Format("Node{0}", x*4 + y));
// Set the checked state of one of the nodes to
// demonstrate the showCheckedNodesButton button behavior.
treeView1.Nodes[1].Nodes[0].Nodes[0].Checked = true;
// Initialize showCheckedNodesButton.
showCheckedNodesButton.Size = new Size(144, 24);
showCheckedNodesButton.Text = "Show Checked Nodes";
showCheckedNodesButton.Click +=
new EventHandler(showCheckedNodesButton_Click);
// Initialize the form.
this.ClientSize = new Size(292, 273);
this.Controls.AddRange(new Control[]
{ showCheckedNodesButton, treeView1 } );
this.ResumeLayout(false);
[STAThreadAttribute()]
static void Main()
Application.Run(new Form1());
private void showCheckedNodesButton_Click(object sender, EventArgs e)
// Disable redrawing of treeView1 to prevent flickering
// while changes are made.
treeView1.BeginUpdate();
// Collapse all nodes of treeView1.
treeView1.CollapseAll();
// Add the checkForCheckedChildren event handler to the BeforeExpand event.
treeView1.BeforeExpand += checkForCheckedChildren;
// Expand all nodes of treeView1. Nodes without checked children are
// prevented from expanding by the checkForCheckedChildren event handler.
treeView1.ExpandAll();
// Remove the checkForCheckedChildren event handler from the BeforeExpand
// event so manual node expansion will work correctly.
treeView1.BeforeExpand -= checkForCheckedChildren;
// Enable redrawing of treeView1.
treeView1.EndUpdate();
// Prevent expansion of a node that does not have any checked child nodes.
private void CheckForCheckedChildrenHandler(object sender,
TreeViewCancelEventArgs e)
if (!HasCheckedChildNodes(e.Node)) e.Cancel = true;
// Returns a value indicating whether the specified
// TreeNode has checked child nodes.
private bool HasCheckedChildNodes(TreeNode node)
if (node.Nodes.Count == 0) return false;
foreach (TreeNode childNode in node.Nodes)
if (childNode.Checked) return true;
// Recursively check the children of the current child node.
if (HasCheckedChildNodes(childNode)) return true;
return false;
Imports System.Drawing
Imports System.Windows.Forms
Public Class Form1
Inherits Form
Private treeView1 As TreeView
Private showCheckedNodesButton As Button
Public Sub New()
treeView1 = New TreeView
showCheckedNodesButton = New Button
Me.SuspendLayout()
' Initialize treeView1.
treeView1.Location = New Point(0, 25)
treeView1.Size = New Size(292, 248)
treeView1.Anchor = AnchorStyles.Top Or AnchorStyles.Left Or AnchorStyles.Bottom Or AnchorStyles.Right
treeView1.CheckBoxes = True
' Add nodes to treeView1.
Dim node As TreeNode
Dim x As Integer
For x = 0 To 3
' Add a root node.
node = treeView1.Nodes.Add(String.Format("Node{0}", x * 4))
Dim y As Integer
For y = 1 To 4
' Add a node as a child of the previously added node.
node = node.Nodes.Add(String.Format("Node{0}", x * 4 + y))
Next y
Next x
' Set the checked state of one of the nodes to
' demonstrate the showCheckedNodesButton button behavior.
treeView1.Nodes(1).Nodes(0).Nodes(0).Checked = True
' Initialize showCheckedNodesButton.
showCheckedNodesButton.Size = New Size(144, 24)
showCheckedNodesButton.Text = "Show Checked Nodes"
AddHandler showCheckedNodesButton.Click, AddressOf showCheckedNodesButton_Click
' Initialize the form.
Me.ClientSize = New Size(292, 273)
Me.Controls.AddRange(New Control() {showCheckedNodesButton, treeView1})
Me.ResumeLayout(False)
End Sub
<STAThreadAttribute()> _
Shared Sub Main()
Application.Run(New Form1)
End Sub
Private Sub showCheckedNodesButton_Click(ByVal sender As Object, ByVal e As EventArgs)
' Disable redrawing of treeView1 to prevent flickering
' while changes are made.
treeView1.BeginUpdate()
' Collapse all nodes of treeView1.
treeView1.CollapseAll()
' Add the CheckForCheckedChildren event handler to the BeforeExpand event.
AddHandler treeView1.BeforeExpand, AddressOf CheckForCheckedChildren
' Expand all nodes of treeView1. Nodes without checked children are
' prevented from expanding by the checkForCheckedChildren event handler.
treeView1.ExpandAll()
' Remove the checkForCheckedChildren event handler from the BeforeExpand
' event so manual node expansion will work correctly.
RemoveHandler treeView1.BeforeExpand, AddressOf CheckForCheckedChildren
' Enable redrawing of treeView1.
treeView1.EndUpdate()
End Sub
' Prevent expansion of a node that does not have any checked child nodes.
Private Sub CheckForCheckedChildren(ByVal sender As Object, ByVal e As TreeViewCancelEventArgs)
If Not HasCheckedChildNodes(e.Node) Then
e.Cancel = True
End If
End Sub
' Returns a value indicating whether the specified
' TreeNode has checked child nodes.
Private Function HasCheckedChildNodes(ByVal node As TreeNode) As Boolean
If node.Nodes.Count = 0 Then
Return False
End If
Dim childNode As TreeNode
For Each childNode In node.Nodes
If childNode.Checked Then
Return True
End If
' Recursively check the children of the current child node.
If HasCheckedChildNodes(childNode) Then
Return True
End If
Next childNode
Return False
End Function 'HasCheckedChildNodes
End Class
一个复选框显示在树节点标签和树节点
Image
的左侧(如果有)。 复选框允许用户一次选择多个树节点。
当某个
CheckBoxes
TreeView
属性设置为
true
,并且设置
StateImageList
该属性时,
TreeNode
每个图像都包含
TreeView
在显示第
StateImageList
一个和第二个图像中,以分别指示未选中状态或已选中状态。 但是,如果出现以下情况,显示的图像可能有所不同:如果
SelectedImageIndex
节点设置为 0 或 1 以外的值,并且
CheckBoxes
父
TreeView
级的属性设置为
false
,
SelectedImageIndex
则不会自动重置为 -1 以指示它未设置。 在这种情况下,将显示位于所指示索引位置的状态图像。 如果
CheckBoxes
再次设置为
true
,将显示第一张和第二张图像
StateImageList
以分别指示已选中或未选中的状态。
在运行时设置
CheckBoxes
属性时,
TreeView
(看到
Control.RecreateHandle
) 重新创建句柄以更新控件的外观。 这会导致所有树节点都折叠,但所选
TreeNode
节点除外。