フォルダツリービュー(1)

VB SampleFolderTreeView 1 : SubClasses
 フォルダを選択するツリービューを自作してみます。単独で使うものではなく何かのアプリケーションにくっつけて使うものです。あえてドライブとフォルダの表示を別にしていますが、簡略化すればドライブもまとめてツリービューだけに表示することもできます。
 また、このコントロールは、ノードをダブルクリックするとパス名を返します。したがって、フォルダ選択ダイアログボックスなどへの応用も可能です。また、フォルダの作成・削除、フォルダ名の変更などもできるようにしたいと思います。

【INDEX】
●ページ1 : フォームとアイテムクラス
フォーム設計
 ... フォームやメニューの設計
ドライブ項目のクラス
 ... ドライブを選択する際のアイテムクラス
フォルダノードのクラス
 ... フォルダを選択する際のノードクラス
ページ2 : ドライブとフォルダの表示
ページ3 : イベント処理とフォルダ操作

(作成時の環境 : VB.net 2002 / Framework SDK 1.0)

■フォーム設計
 フォームは、UserControl を使っています。フォーム上にドライブ選択用の ComboBox(CB1) と フォルダ選択用の TreeView(TV1) を配置します。さらに ImageList(IL1) を配置してお好みのアイコンを追加します。アイコンはVB付属のもので十分だと思います。
 各コントロールのデフォルト値以外のプロパティは次の様に設定しています。

CB1
... ContextMenu : PUP1
... DrawMode : OwnerDrawFixed
... ItemHeight : 15
... Dock : Top
... DrapDownStyle : DropDownList

TV1
... ContextMenu : PUP1
... ImageList : IL1
... Dock : Fill

PUP1
(MenuItem)
... mnOpen : フォルダを開く(&O)
... mnUpdate : 更新(&U)
... mnMakeFolder : フォルダの作成(&M)
... mnDeleteFolder : フォルダの削除(&D)
... mnRename : 名前の編集(&N)
 (セパレータは省略)
IL1
... ImageSize : 16, 16
... ColorDepth : Depth8Bit
 (左図のように Images プロパティに追加)
| ▲TOP |

■ドライブ項目のクラス
 ComboBox(CB1) に表示するアイテムをクラス化したものです。各アイテムは、ドライブ名、ドライブのボリュームラベル文字列、アイコンのインデックスを保持します。アイコンのインデックスは、イメージリストにおけるインデックスと一致させる必要があります。
 なお、ドライブ名の表示は、アイコンの描画を伴うため、UserControl 側のオーナードロー関数で行います。
Public Class DriveItem
    Inherits System.Object

    ' 内部変数
    Private m_name As String = ""         ' ドライブ名
    Private m_volume As String = ""       ' ボリュームラベル
    Private m_imageindex As Integer = 0  ' イメージの番号

    ' プロパティ : ドライブ名
    Public Property Name() As String
        Get
            Return m_name
        End Get
        Set(ByVal Value As String)
            m_name = Value
        End Set
    End Property

    ' プロパティ : ボリュームラベル
   Public Property Volume() As String
        Get
            Return m_volume
        End Get
        Set(ByVal Value As String)
            m_volume = Value
        End Set
    End Property

    ' プロパティ : イメージの番号
    Public Property ImageIndex() As Integer
        Get
            Return m_imageindex
        End Get
        Set(ByVal Value As Integer)
            m_imageindex = Value
        End Set
    End Property

    ' コンストラクタ
    Public Sub New()
    End Sub

    ' コンストラクタ (プロパティ値指定)
    Public Sub New(ByVal name As String, _
                          ByVal volume As String, _
                          ByVal imageindex As Integer)
        m_name = name
        m_volume = volume
        m_imageindex = imageindex
    End Sub

End Class	
| ▲TOP |

■フォルダノードのクラス
 フォルダ名を表示するツリーノードの派生クラスです。各ノードは、パス名と、展開済みかどうかの情報を保持します。ノードは、最初からすべて展開して表示すると起動時のパフォーマンスが落ちるので、ユーサーのダブルクリックによって個々に展開させるようにしています。そのため、展開済みなら true 、未展開なら false の値を IsVested プロパティに設定します。
Public Class PathNode
    Inherits System.Windows.Forms.TreeNode

    ' 内部変数
    Private m_folderpath As String = ""        ' パス名
    Private m_isvested As Boolean = False    ' 子ノードを展開したかどうか

    ' プロパティ : パス名
    Public Property FolderPath() As String
        Get
            Return m_folderpath
        End Get
        Set(ByVal Value As String)
            m_folderpath = Value
        End Set
    End Property

    ' プロパティ : 子ノードを展開したかどうか
    Public Property IsVested() As Boolean
        Get
            Return m_isvested
        End Get
        Set(ByVal Value As Boolean)
            m_isvested = Value
        End Set
    End Property

    ' コンストラクタ(パス名を指定)
    Public Sub New(ByVal path As String)
        MyBase.New()
        m_folderpath = path
        Me.Text = System.IO.Path.GetFileNameWithoutExtension(path)
    End Sub

    ' コンストラクタ(パス名と表示イメージのインデックスを指定)
    Public Sub New(ByVal path As String, ByVal image1 As Integer, ByVal image2 As Integer)
        MyBase.New()
        m_folderpath = path                       ' パス名
        Me.Text = System.IO.Path.GetFileNameWithoutExtension(path)  ' 表示テキスト
        Me.ImageIndex = image1                 ' 通常のイメージのインデックス
        Me.SelectedImageIndex = image2     ' 選択時のイメージのインデックス
    End Sub

End Class	

| ■HOME | ◆プログラムTop | ▲ページの先頭 |