Export (0) Print
Expand All

TreeView.BeforeCheck Event

Occurs before the tree node check box is checked.

[Visual Basic]
Public Event BeforeCheck As TreeViewCancelEventHandler
[C#]
public event TreeViewCancelEventHandler BeforeCheck;
[C++]
public: __event TreeViewCancelEventHandler* BeforeCheck;

[JScript] In JScript, you can handle the events defined by a class, but you cannot define your own.

Event Data

The event handler receives an argument of type TreeViewCancelEventArgs containing data related to this event. The following TreeViewCancelEventArgs properties provide information specific to this event.

Property Description
Action Gets the type of TreeViewAction that raised the event.
Cancel (inherited from CancelEventArgs) Gets or sets a value indicating whether the event should be canceled.
Node Gets the tree node to be checked, expanded, collapsed, or selected.

Remarks

Note   Setting the TreeNode.Checked property from within the BeforeCheck or AfterCheck event causes the event to be raised multiple times and can result in unexpected behavior. For example, you might set the Checked property in the event handler when you are recursively updating the child nodes, so the user does not have to expand and check each one individually. To prevent the event from being raised multiple times, add logic to your event handler that only executes your recursive code if the Action property of the TreeViewEventArgs is not set to TreeViewAction.Unknown.

For more information about handling events, see Consuming Events.

Example

[Visual Basic, C#, C++] The following example updates all the child tree nodes of a TreeNode when the user changes its checked state. This code assumes you have a Form with a TreeView that has TreeNode objects in its TreeNodeCollection. The TreeNodeCollection should have tree nodes with child nodes.

[Visual Basic] 
' Updates all child tree nodes recursively.
Private Sub CheckAllChildNodes(treeNode As TreeNode, nodeChecked As Boolean)
   Dim node As TreeNode
   For Each node In  treeNode.Nodes 
      node.Checked = nodeChecked
      If node.Nodes.Count > 0 Then
         ' If the current node has child nodes, call the CheckAllChildsNodes method recursively.
         Me.CheckAllChildNodes(node, nodeChecked)
      End If
   Next node
End Sub
      
' NOTE   This code can be added to the BeforeCheck event handler instead of the AfterCheck event.
' After a tree node's Checked property is changed, all its child nodes are updated to the same value.
Private Sub node_AfterCheck(sender As Object, e As TreeViewEventArgs) Handles treeView1.AfterCheck
   ' The code only executes if the user caused the checked state to change.
   If e.Action <> TreeViewAction.Unknown Then 
      If e.Node.Nodes.Count > 0 Then
         ' Calls the CheckAllChildNodes method, passing in the current 
         ' Checked value of the TreeNode whose checked state changed. 
         Me.CheckAllChildNodes(e.Node, e.Node.Checked)
      End If
   End If
End Sub 

[C#] 
// Updates all child tree nodes recursively.
private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
{
   foreach(TreeNode node in treeNode.Nodes)
   {
      node.Checked = nodeChecked;
      if(node.Nodes.Count > 0)
      {
         // If the current node has child nodes, call the CheckAllChildsNodes method recursively.
         this.CheckAllChildNodes(node, nodeChecked);
      }
   }
}

// NOTE   This code can be added to the BeforeCheck event handler instead of the AfterCheck event.
// After a tree node's Checked property is changed, all its child nodes are updated to the same value.
private void node_AfterCheck(object sender, TreeViewEventArgs e)
{
   // The code only executes if the user caused the checked state to change.
   if(e.Action != TreeViewAction.Unknown)
   {
      if(e.Node.Nodes.Count > 0)
      {
         /* Calls the CheckAllChildNodes method, passing in the current 
         Checked value of the TreeNode whose checked state changed. */
         this.CheckAllChildNodes(e.Node, e.Node.Checked);
      }
   }
}

[C++] 
// Updates all child tree nodes recursively.
private:
void CheckAllChildNodes(TreeNode* treeNode, bool nodeChecked) {
    IEnumerator* myEnum = treeNode->Nodes->GetEnumerator();
    while (myEnum->MoveNext()) {
        TreeNode* node = __try_cast<TreeNode*>(myEnum->Current);

        node->Checked = nodeChecked;
        if (node->Nodes->Count > 0) {
            // If the current node has child nodes, call the CheckAllChildsNodes method recursively.
            this->CheckAllChildNodes(node, nodeChecked);
        }
    }
}

// NOTE   This code can be added to the BeforeCheck event handler instead of the AfterCheck event.
// After a tree node's Checked property is changed, all its child nodes are updated to the same value.
void node_AfterCheck(Object* /*sender*/, TreeViewEventArgs* e) {
    // The code only executes if the user caused the checked state to change.
    if (e->Action != TreeViewAction::Unknown) {
        if (e->Node->Nodes->Count > 0) {
            /* Calls the CheckAllChildNodes method, passing in the current
            Checked value of the TreeNode whose checked state changed. */
            this->CheckAllChildNodes(e->Node, e->Node->Checked);
        }
    }
}

[JScript] No example is available for JScript. To view a Visual Basic, C#, or C++ example, click the Language Filter button Language Filter in the upper-left corner of the page.

Requirements

Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family

See Also

TreeView Class | TreeView Members | System.Windows.Forms Namespace | CheckBoxes | OnBeforeCheck | AfterCheck | OnAfterCheck

Show:
© 2014 Microsoft