2015-11-14

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

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

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

リストビューは、以前ご紹介したリストボックスとは異なり、表示方法を指定できること、詳細表示を指定すれば、サブ項目まで表示させることができます。

今回のリストビューでは、詳細表示を取り上げていきますので、予めご了承ください。

<今回の完成品>


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

# PowerShellでユーザーフォームを作る - リストビュー編 -
# アセンブリのロード
Add-Type -AssemblyName System.Windows.Forms

#フォーム
$Form = New-Object System.Windows.Forms.Form
$Form.Size = "340,250"
$Form.StartPosition = "CenterScreen"
$Form.Text = "メンバー一覧"

# リストビューの設置
$View = New-Object System.Windows.Forms.ListView
$View.Location = "10,10"
$View.Size = "300,150"
$View.View = "Details"
$View.GridLines = $True

# リストビューにヘッダーを追加
[void]$View.Columns.Add("名前",100)
[void]$View.Columns.Add("性別",100)
[void]$View.Columns.Add("年齢",95)

# 項目を追加
$Item = New-Object System.Windows.Forms.ListViewItem("山田 太郎")
[void]$Item.SubItems.Add("男")
[void]$Item.SubItems.Add("20")
[void]$View.Items.Add($Item)

$Item2 = New-Object System.Windows.Forms.ListViewItem("田中 花子")
[void]$Item2.SubItems.Add("女")
[void]$Item2.SubItems.Add("15")
[void]$View.Items.Add($Item2)

$Item3 = New-Object System.Windows.Forms.ListViewItem("鈴木 三郎")
[void]$Item3.SubItems.Add("男")
[void]$Item3.SubItems.Add("25")
[void]$View.Items.Add($Item3)

#閉じるボタン
$Button = New-Object System.Windows.Forms.Button
$Button.Location = "230,170"
$Button.Size = "80,30"
$Button.Text  = "閉じる"
$Button.FlatStyle = "popup"
$Button.DialogResult = [System.Windows.Forms.DialogResult]::Cancel

$Form.Controls.AddRange(@($View,$Button))

$Form.Showdialog()

上記内容をコピーし、PowerShell ISEに貼り付けて、実行してみてください。
完成品と同じものが表示されるはずです。

それでは解説をしていきます。
また過去の記事で解説した部分については割愛致します。

内容をご確認いただきたい場合は【ユーザーフォーム - 基礎編 -】をご覧ください。

*****解説*****************************************************************************
# リストビューの設置
$View = New-Object System.Windows.Forms.ListView
$View.Location = "10,10"
$View.Size = "300,150"
$View.View = "Details"
$View.GridLines = $True
ここでは、ListViewクラスをインスタンス化し、変数Viewに格納しています。
Locationプロパティで位置を、Sizeプロパティでリストビューの大きさを指定しています。
Viewプロパティには詳細表示を意味する"Details"を指定しています。
また、Viewプロパティが"Details"の場合のみ使用できるGridLineプロパティを有効にし、行と列の間にグリッド線を入れています。

ではここで、ListViewクラスで覚えておくと便利だなと筆者が思うプロパティをご紹介します。

●Viewプロパティ
 表示方法を指定します。
 選択肢は"Details"、"LargeIcon"、"SmallIcon"、"List"、"Tile"です。
 規定値は"LargeIcon"です。

●CheckBoxesプロパティ
 各項目の横にチェックボックスを付けるかどうかを指定します。
 規定値はFalseです

●CheckedItemsプロパティ
 チェックボックスが有効になっている状態で、チェックが付いている項目を取得します。
 今回の例でいうと、次の画像のようにチェックが入っている場合・・・
  $View.CheckedItems[0].Text ⇒ 「田中 花子」
  $View.CheckedItems[1].Text ⇒ 「鈴木 三郎」
  $View.CheckedItems[0].SubItems[2].Text ⇒ 「15」
  $View.CheckedItems[1].SubItems[1].Text ⇒ 「男」


●FullRowSelectプロパティ
 項目を選択した時、そのサブ項目も選択状態にするかどうかを指定します。
 規定値はFalseです。

●HeaderStyleプロパティ
 列ヘッダーのスタイルを指定します。
 選択肢は"Clickabel"、"NonClickable"、"None"です。
 規定値は"Clickabel"です。

●HoverSelectionプロパティ
 マウスポインターが項目上に1秒程留まった時、その項目を選択状態にするかどうかを指定します。
 規定値はFalseです。

●Itemsプロパティ
 ListView内の全ての項目を取得します。
 今回の例でいうと、次のように記述すれば、それぞれを個別に取得することができます。
  $View.Items[0].Subitems[2].Text ⇒ 「20」
  $View.Items[1].Subitems[0].Text ⇒ 「田中 花子」
  $View.Items[2].Subitems[1].Text ⇒ 「男」
  $View.Items[1].Index ⇒ 「1」

●MultiSelectプロパティ
 複数の項目を同時に選択できるようにするかどうかを指定します。
 規定値はTrueです。
 同時に選択するには、CtrlキーもしくはShiftキーを押しながらクリックします。

●Scrollableプロパティ
 ListViewの幅に対し、ヘッダー幅合計の方が大きい場合、自動的にスクロールバーを付加するかどうかを指定します。
 規定値はTrue(付加する)です。

●SelectedItemsプロパティ
 選択されている項目を取得します。
 今回の例でいうと、次の画像のように選択された場合、下記のように記述することで、目的のものだけを取得することができます。
  $View.SelectedItems[0].SubItems[1].Text ⇒ 「男」
  $View.SelectedItems[1].SubItems[0].Text ⇒ 「田中 花子」

# リストビューにヘッダーを追加
[void]$View.Columns.Add("名前",100)
[void]$View.Columns.Add("性別",100)
[void]$View.Columns.Add("年齢",95)
ここでは、リストビューに列ヘッダーを追加しています。
第1引数は列タイトルを、第2引数は列幅を指定しています。
文頭に[void]を記述しているのは、コンソールへの出力を防ぐためです。
# 項目を追加
$Item = New-Object System.Windows.Forms.ListViewItem("山田 太郎")
[void]$Item.SubItems.Add("男")
[void]$Item.SubItems.Add("20")
[void]$View.Items.Add($Item)
ここでは、リストビューに項目を追加しています。
項目名「山田 太郎」を引数に持たせた状態でListViewItemをインスタンス化し、さらにサブ項目を追加して、リストビューに追加します。

*************************************************************************************************

解説は以上となります。

個人的には、リストボックスよりもリストビューの方が、表のようになっていて見やすいので、便利だなと思っています。

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


9 件のコメント:

  1. 突然失礼いたします。

    このリストビューに、ツールチップを表示することは、可能でしょうか。
    貴ホームページの他の記事を参考に、実装しましたが表示されませんでした。
    (ボタンの場合は、正常に動作しました。)

    コメントいただけると幸いです。

    返信削除
    返信
    1. コメントありがとうございます。

      リストビューにもツールチップは実装可能です。

      上記の「ここから~ここまで」のスクリプトを参考にしますと、「#閉じるボタン」の前行あたりに、次の記述を追加してみてください。

      # ツールチップ
      $Tooltip = New-Object System.Windows.Forms.Tooltip
      $View.Add_MouseHOver({$Tooltip.SetToolTip($View,"表示させる文字列")})

      リストビューのマウスオーバーイベントに、ツールチップを設定しています。

      削除
    2. ご返信ありがとうございました。
      うまく解決できました。

      削除
    3. CheckedItemsプロパティのチェックマークを、解除する方法をご存じでしょうか?
      チェックマークをつけた後のやりたいことは実装できたのですが、その処理完了後に、
      チェックマークを外したいのですが・・・。

      削除
    4. こんにちは!
      コメントありがとうございます。

      チェックマークを解除するには、各項目のCheckedプロパティを$Falseにすることで外すことができます。

      以下のスクリプトは上記の本文中のサンプルスクリプトを改造したもので、最初から全ての項目にチェックが付いています。
      そして、「処理開始」ボタンをクリックすると、2つめの項目のチェックが外れるようになっています。

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Add-Type -AssemblyName System.Windows.Forms

      $Form = New-Object System.Windows.Forms.Form
      $Form.Size = "340,250"
      $Form.StartPosition = "CenterScreen"
      $Form.Text = "メンバー一覧"

      $View = New-Object System.Windows.Forms.ListView
      $View.Location = "10,10"
      $View.Size = "300,150"
      $View.View = "Details"
      $View.GridLines = $True
      $View.CheckBoxes = $True

      [void]$View.Columns.Add("名前",100)
      [void]$View.Columns.Add("性別",100)
      [void]$View.Columns.Add("年齢",95)

      # 項目を追加
      $Item = New-Object System.Windows.Forms.ListViewItem("山田 太郎")
      [void]$Item.SubItems.Add("男")
      [void]$Item.SubItems.Add("20")
      [void]$View.Items.Add($Item)
      $Item.Checked = $True

      $Item2 = New-Object System.Windows.Forms.ListViewItem("田中 花子")
      [void]$Item2.SubItems.Add("女")
      [void]$Item2.SubItems.Add("15")
      [void]$View.Items.Add($Item2)
      $Item2.Checked = $True

      $Item3 = New-Object System.Windows.Forms.ListViewItem("鈴木 三郎")
      [void]$Item3.SubItems.Add("男")
      [void]$Item3.SubItems.Add("25")
      [void]$View.Items.Add($Item3)
      $Item3.Checked = $True

      # 処理開始ボタン
      $Button_A = New-Object System.Windows.Forms.Button
      $Button_A.Location = "50,170"
      $Button_A.Size = "80,30"
      $Button_A.Text = "処理開始"
      $Button_A.FlatStyle = "popup"

      # 処理開始ボタンのクリックイベント
      $process = {

      # ~~何らかの処理を記述~~

      # チェックをはずす
      $Item2.Checked = $False
      }
      $Button_A.Add_Click($process)

      $Button = New-Object System.Windows.Forms.Button
      $Button.Location = "230,170"
      $Button.Size = "80,30"
      $Button.Text = "閉じる"
      $Button.FlatStyle = "popup"
      $Button.DialogResult = [System.Windows.Forms.DialogResult]::Cancel

      $Form.Controls.AddRange(@($View,$Button_A,$Button))

      $Form.Showdialog()
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      各項目の追加時に、Checkedプロパティを$Trueにし、チェックが付くようにしています。
      そして、処理開始ボタンのクリックイベント内に項目2のみCheckedプロパティを$Falseにしています。

      以上、ご検討ください。m(__)m

      削除
    5. ありがとうございます。
      解決できました。

      .Checked = $Falseだったのですね。 Clearとか、違う方向にはしっていました。

      削除
  2. 初めまして。 PowerShell新参者です。
    リストビューについて、質問がございます。
    よろしければ、回答していただけると幸いです。

    ①チェックボックス付きのリストビューでチェックされた項目の
     内容を順次取得する方法がよくわからないです・・・

    ②ワンクリックでチェックのオンオフを切り替えられるでしょうか?

    返信いただけますと助かります。

    返信削除
    返信
    1. 匿名様
      コメントありがとうございます!
      また、返答が遅くなり申し訳ありません。

      上記①と②を網羅したスクリプトを作成しました!

      ---ここから---
      # PowerShellでユーザーフォームを作る - リストビュー編 -
      # アセンブリのロード
      Add-Type -AssemblyName System.Windows.Forms

      # 発生するイベント
      $event = {
      try{
      # 選択項目のチェック状態を取得
      if ($View.SelectedItems[0].Checked) {
      # チェックを外す
      $view.SelectedItems[0].Checked = $false
      }else{
      # チェックを付ける
      $view.SelectedItems[0].Checked = $true
      }
      }catch{
      # 何もしない
      }
      }

      #フォーム
      $Form = New-Object System.Windows.Forms.Form
      $Form.Size = "340,250"
      $Form.StartPosition = "CenterScreen"
      $Form.Text = "メンバー一覧"

      # リストビューの設置
      $View = New-Object System.Windows.Forms.ListView
      $View.Location = "10,10"
      $View.Size = "300,150"
      $View.View = "Details"
      $View.GridLines = $True
      $View.CheckBoxes = $True
      $View.FullRowSelect = $True

      # リストビューの選択項目が変更されたときに発動
      $View.add_SelectedIndexChanged($event)

      # リストビューにヘッダーを追加
      [void]$View.Columns.Add("名前",100)
      [void]$View.Columns.Add("性別",100)
      [void]$View.Columns.Add("年齢",95)

      # 項目を追加
      $Item = New-Object System.Windows.Forms.ListViewItem("山田 太郎")
      [void]$Item.SubItems.Add("男")
      [void]$Item.SubItems.Add("20")
      [void]$View.Items.Add($Item)

      $Item2 = New-Object System.Windows.Forms.ListViewItem("田中 花子")
      [void]$Item2.SubItems.Add("女")
      [void]$Item2.SubItems.Add("15")
      [void]$View.Items.Add($Item2)

      $Item3 = New-Object System.Windows.Forms.ListViewItem("鈴木 三郎")
      [void]$Item3.SubItems.Add("男")
      [void]$Item3.SubItems.Add("25")
      [void]$View.Items.Add($Item3)

      #閉じるボタン
      $Button = New-Object System.Windows.Forms.Button
      $Button.Location = "230,170"
      $Button.Size = "80,30"
      $Button.Text = "チェック項目取得"
      $Button.FlatStyle = "popup"
      #$Button.DialogResult = [System.Windows.Forms.DialogResult]::Cancel

      # ボタンクリック時の処理
      $button_event = {
      # 行数
      $r = $view.Items.Count

      # 順番に見ていって、チェックがついていれば出力
      for ($i=0; $i -le $r; $i++){
      if ($view.Items[$i].Checked){
      write-host $view.Items[$i].SubItems[0].Text
      }
      }
      }
      $Button.add_click($button_event)

      $Form.Controls.AddRange(@($View,$Button))

      $Form.Showdialog()
      ---ここまで---

      もっとスマートな方法があるのかもしれませんが、ひとまずこのスクリプトでの動作は確認できました!

      どうぞご確認をお願いいたします。
      不明点がありましたら、お気軽にご連絡ください!
      \(^o^)/

      削除
    2. 回答ありがとうございます!
      解決できました!
      また何かありましたらよろしくお願いいたします。

      削除

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