次の方法で共有


TreeViewCancelEventHandler デリゲート

TreeViewBeforeCheckBeforeCollapseBeforeExpandBeforeSelect の各イベントを処理するメソッドを表します。

<Serializable>
Public Delegate Sub TreeViewCancelEventHandler( _   ByVal sender As Object, _   ByVal e As TreeViewCancelEventArgs _)
[C#]
[Serializable]
public delegate void TreeViewCancelEventHandler(   object sender,   TreeViewCancelEventArgs e);
[C++]
[Serializable]
public __gc __delegate void TreeViewCancelEventHandler(   Object* sender,   TreeViewCancelEventArgs* e);

[JScript] JScript では、.NET Framework のデリゲートを利用することができます。ただし、独自に定義することはできません。

パラメータ [Visual Basic, C#, C++]

作成するイベント ハンドラは、TreeViewCancelEventHandler クラスのデリゲート定義と同一のパラメータを持つ必要があります。

解説

TreeViewCancelEventArgs デリゲートを作成する場合は、イベントを処理するメソッドを識別してください。イベントをイベント ハンドラに関連付けるには、デリゲートのインスタンスをイベントに追加します。デリゲートを削除しない限り、そのイベントが発生すると常にイベント ハンドラが呼び出されます。イベント ハンドラ デリゲートの詳細については、「 イベントとデリゲート 」を参照してください。

使用例

[Visual Basic, C#, C++] TreeView の折りたたみの状態を変更して、チェックされているノードを表示する方法を次の例に示します。まず、すべてのノードが折りたたまれ、 TreeView.BeforeExpand イベントにハンドラが追加されます。次に、すべてのノードが展開されます。 TreeView.BeforeExpand イベント ハンドラは、指定したノードに、チェックされている子ノードがあるかどうかを確認します。チェックされている子ノードがない場合、そのノードの展開はキャンセルされます。次に、ノードの横にあるプラス記号がクリックされたときに通常のノードを展開できるようにするため、 TreeView.BeforeExpand イベント ハンドラが削除されます。

[Visual Basic, C#, C++] TreeView.BeforeCollapse イベントを処理してこの動作を実装することもできます。詳細については、該当するトピックの例を参照してください。

 
Imports System
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 'New

    Shared Sub Main()
        Application.Run(New Form1)
    End Sub 'Main

    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 'showCheckedNodesButton_Click

    ' 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 'CheckForCheckedChildren

    ' 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 'Form1 

[C#] 
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);
    }

    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;
    }

}

[C++] 
#using <mscorlib.dll>
#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 __gc class Form1 : public Form
{
private:
    TreeView* treeView1;
    Button* showCheckedNodesButton;
    TreeViewCancelEventHandler* checkForCheckedChildren;

public:
    Form1()
    {
        treeView1 = new TreeView();
        showCheckedNodesButton = new Button();
        checkForCheckedChildren = 
            new 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(S"Node{0}", __box(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(S"Node{0}", __box(x*4 + y)));
            }
        }

        // Set the checked state of one of the nodes to
        // demonstrate the showCheckedNodesButton button behavior.
        treeView1->Nodes->Item[1]->Nodes->Item[0]->Nodes->Item[0]->Checked = true;

        // Initialize showCheckedNodesButton.
        showCheckedNodesButton->Size = System::Drawing::Size(144, 24);
        showCheckedNodesButton->Text = S"Show Checked Nodes";
        showCheckedNodesButton->Click += 
            new EventHandler(this, &Form1::showCheckedNodesButton_Click);

        // Initialize the form.
        this->ClientSize = System::Drawing::Size(292, 273);

        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 = __try_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(new Form1());
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

名前空間: System.Windows.Forms

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET

アセンブリ: System.Windows.Forms (System.Windows.Forms.dll 内)

参照

System.Windows.Forms 名前空間 | TreeViewCancelEventArgs | TreeView