2016-03-24

PowerShellでユーザーフォームを作る - ツリービュー編 -

PowerShellでは、ユーザーの好みに合わせて、独自にフォームを作成することができます。

今回は「PowerShellでユーザーフォームを作る - ツリービュー編 -」です。

ツリービューはリストボックスやリストビューなどと同じ「リスト系コントロール」のひとつです。


ツリービューの代表的な使用例といえば、上記のようなフォルダの階層表示が有名です。

<今回の完成品>

展開時と折り畳み時

それではスクリプトを記述していきます。


# PowerShellでユーザーフォームを作る - ツリービュー編 -

# アセンブリのロード
Add-Type -AssemblyName System.Windows.Forms

$form = New-Object System.Windows.Forms.Form
$form.Size = "200,300"
$form.StartPosition = "CenterScreen"
$form.Text = "TreeView"

# TreeViewクラス
$TreeView = New-Object System.Windows.Forms.TreeView
$TreeView.Location = "10,10"
$TreeView.Size = "150,200"

# 親ノードを入れる
[void]$TreeView.Nodes.Add("親1")
[void]$TreeView.Nodes.Add("親2")
[void]$TreeView.Nodes.Add("親3")

# 子ノードを入れる
[void]$TreeView.Nodes[0].Nodes.Add("子1")
[void]$TreeView.Nodes[0].Nodes.Add("子2")
[void]$TreeView.Nodes[2].Nodes.Add("子3")

# 孫ノードを入れる
[void]$TreeView.Nodes[0].Nodes[0].Nodes.Add("孫1")

$Button = New-Object System.Windows.Forms.Button
$Button.Location = "50,220"
$Button.Size = "80,30"
$Button.Text  = "開く"
$open_close = {
    if ( $Button.Text -eq "開く")
    {
        $TreeView.ExpandAll()
        $button.Text = "閉じる"
    }else{
        $TreeView.CollapseAll()
        $button.Text = "開く"
    }
}
$Button.Add_Click($open_close)

$form.Controls.AddRange(@($TreeView,$Button))
$Form.Showdialog()
上記内容をコピーし、PowerShell ISEに貼り付け後、実行すると上の画像と同じものが表示されるはずです。

続いて解説をしていきます。

※過去の記事で解説した部分については割愛致します。
 内容をご確認いただきたい場合は【ユーザーフォーム - 基礎編 -】をご覧ください。

*****解説*****************************************************************************
# TreeViewクラス
$TreeView = New-Object System.Windows.Forms.TreeView
$TreeView.Location = "10,10"
$TreeView.Size = "150,200"

まずはじめに、TreeViewのインスタンス化(使用するための宣言)を行います。
さらにLocationプロパティで配置位置を、Sizeプロパティで大きさを指定しています。
# 親ノードを入れる
[void]$TreeView.Nodes.Add("親1")
[void]$TreeView.Nodes.Add("親2")
[void]$TreeView.Nodes.Add("親3")
ツリービューはノードと言われる要素で形成され、ノードが枝分かれするようにつながっていきます。

今回は分かりやすいように「親ノード」「子ノード」「孫ノード」という表現にしてみました。

ここでは親ノードを3つ作成しています。
# 子ノードを入れる
[void]$TreeView.Nodes[0].Nodes.Add("子1")
[void]$TreeView.Nodes[0].Nodes.Add("子2")
[void]$TreeView.Nodes[2].Nodes.Add("子3")

続いて、親ノードに子ノードを追加しています。
親ノードはインデックス番号で指定します。
# 孫ノードを入れる
[void]$TreeView.Nodes[0].Nodes[0].Nodes.Add("孫1")

さらに子ノードに孫ノードを追加しています。
親ノードと子ノードをインデックス番号で指定しています。
$open_close = {
    if ( $Button.Text -eq "開く")
    {
        $TreeView.ExpandAll()
        $button.Text = "閉じる"
    }else{
        $TreeView.CollapseAll()
        $button.Text = "開く"
    }
}
$Button.Add_Click($open_close)

この記述はボタンのクリックイベントを示しています。
イベントの内容は「ボタンを押した時、ボタンの文字が『開く』の場合はツリービューを全て展開し、ボタンの文字を『閉じる』に変える。『開く』以外の文字の場合はツリービューを全て折り畳み、ボタンの文字を『開く』に変える」というものです。

ツリービューはExpandAll()メソッドで一括展開、CollapseAll()メソッで一括折り畳みをすることができます。

ここで、使用頻度が高そうなプロパティをいくつかご紹介致します。
# 各ノードをつなぐ線を表示しない。
$TreeView.ShowLines = $False

# 親ノードをつなげる線を表示しない。
$TreeView.ShowRootLines = $False

# 分岐のあるノードに付属する+ボタン-ボタンを表示しない。
# 項目をダブルクリックすれば、展開/折り畳みが可能
$TreeView.ShowPlusMinus = $False

# 選択中のノードの情報を取得する
$TreeView.SelectedNode

# 親ノードの全ての情報を取得する
$TreeView.Nodes

# 親1ノードの個別の情報を取得する
$TreeView.Nodes.Item(0)

# 親1ノードの子ノードの情報を全て取得する
$TreeView.Nodes.Item(0).Nodes

# 子1ノードの情報を取得する
$TreeView.Nodes.Item(0).Nodes.Item(0)

# 孫1ノードの情報を取得する
$TreeView.Nodes.Item(0).Nodes.Item(0).Nodes.Item(0)

<#
情報を取得する際は、最後に取得したい項目を指定することで、特定の情報だけを得ることができる。
例えば…$TreeView.Nodes を $TreeView.Nodes.Text とすれば、「親1 親2 親3」の結果が返る。
#>

# ツールチップの表示を許可する
$TreeView.ShowNodeToolTips  =$True

# 子2ノードにツールチップを設定する
$TreeView.Nodes.Item(0).Nodes.Item(1).ToolTipText = "子2ノードです"

他にもプロパティやメソッドは多くありますので、詳細はTreeViewクラスを参照ください。
*************************************************************************************************

解説は以上となります。

ツリービューはリストビューやデータグリッドビューと比べると使用頻度が低いかもしれません。
階層表示を必要とする機会が今までほとんどありませんでした。(汗

もし、階層表示が必要となった場合は、ぜひご参考ください。

=============================================================
本投稿に関する疑問や質問には可能な限りお答えさせていただきます。
お気軽にコメントやメールをお送りください。
(リクエストも歓迎します)
メール:tkk-powershell@gmail.com
また、間違いのご指摘・アドバイス等も歓迎いたします。
=============================================================
Google+、Twitterで更新情報をお届けしています!
ぜひフォローをお願い致します!           
=============================================================
スポンサーリンク


0 件のコメント:

コメントを投稿

疑問・質問・リクエスト お気軽にどうぞ (^O^)/