- ベストアンサー
TreeViewについて
いつも大変お世話になっております。福島です。 TreeViewのことで教えて頂きたいのですが・・・ 社員登録で3階層(部・課・社員)のツリー構造をなす TreeViewを作成しましたが、1社員の情報を変更したときに 状態を反映するためにTreeView全体を消去してから書き直しています。 (例えば)課や部を移動したとき しかし表示する数が多くなってきた為に再構築に非常に時間が かかってしまい実用的でなくなってしまいました。 あるノードの下だけ変更(削除)する方法はありますか? 今は、「treeView.Nodes.Clear」を使用して全体を削除して 再度ツリーを作成しています。 aNode(部) bNode(課) cNode(社員) のようになっています。 宜しくお願い申し上げます。 Windows2000SP2 + VB6.0SP4
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
サンプルです。 TreeViewとコマンドボタンが必要です。 NodesはNodeオブジェクトのコレクションです。 As Collection と言う宣言を使用したことがある人ならわかると思うのですが、未経験者であれば、これを機に覚えることをお勧めします。 Collectionは登録時にKeyを仕込むことができます。 サンプルで言うと .Add "会社", tvwChild, "経理部", "経理部" というのは .追加 "親となる物のキー", 自分は子, "キー文字列", "TreeViewに表示するテキスト" となります。そのキーは重複することの無いように登録をしなければいけません。 そうすることによりキーでNodesコレクションからNodeオブジェクトの情報を取得することができます。 それを指定してあげると、削除できます。 また、キー文字列を指定しないでも、TreeViewの表示順にIndex値を持ちますので、それを利用してもオブジェクトの指定ができます。 注意すべきはNodesコレクションに追加するときは、キーには数値を登録できないことです。 "1"とかは無理ですが、"1A1"などは可能です。 Option Explicit Private Sub Command1_Click() Dim nodWork As Node Dim lngSts As Long With Me With .TreeView1 Set nodWork = .SelectedItem If nodWork Is Nothing Then Call MsgBox("未選択なので、削除無効") Exit Sub End If lngSts = MsgBox("[" & nodWork.Text & "]を削除しますか?", vbOKCancel) If lngSts = vbCancel Then Exit Sub End If '選択中のノードを削除 .Nodes.Remove nodWork.Key '下のような表現でもよい(キー文字列かIndex文字列を渡す) '.Nodes.Remove nodWork.Index End With End With End Sub Private Sub Form_Load() With Me With .TreeView1 With .Nodes 'NODEを追加 'これについては説明不要とします。。。 .Add , , "会社", "会社" .Add "会社", tvwChild, "経理部", "経理部" .Add "経理部", tvwChild, "財務課", "財務課" .Add "経理部", tvwChild, "購買課", "購買課" .Add "会社", tvwChild, "総務部", "総務部" .Add "総務部", tvwChild, "総務課", "総務課" .Add "総務部", tvwChild, "用務課", "用務課" .Add "会社", tvwChild, "営業部", "営業部" .Add "営業部", tvwChild, "法人営業課", "法人営業課" .Add "営業部", tvwChild, "お客様サービス課", "お客様サービス課" End With '経理部が初期表示で見えるようにする(同時に、並列の総務部や営業部などの部も見えるようになる) .Nodes("経理部").EnsureVisible '下のような表現でもよい(TreeView内において[経理部]は Index=2だから) '.Nodes(2).EnsureVisible End With .Command1.Caption = "削除" End With End Sub
その他の回答 (1)
- sssohei
- ベストアンサー率33% (33/98)
VBのコントロールにはメソッドがないようなのですが C++ではマクロの TreeView_DeleteItem を使用すれば可能なようです。 英語のMSDNにしか記載されてないようですが^^; http://msdn.microsoft.com/library/en-us/shellcc/platform/CommCtls/TreeView/Macros/TreeView_DeleteItem.asp?frame=true 内部的に TVM_DELETEITEM メッセージをツリービューに送る様なので、SendMessageで代用出来きます。 http://msdn.microsoft.com/library/en-us/shellcc/platform/CommCtls/TreeView/Messages/TVM_DELETEITEM.asp?frame=true lParam にはHitTestの結果を渡せばよいと思います。 http://msdn.microsoft.com/library/en-us/shellcc/platform/CommCtls/TreeView/Messages/TVM_HITTEST.asp?frame=true VC付属の commctrl.h には以下のように宣言されています #define TV_FIRST 0x1100 // TreeView messages #define TVM_DELETEITEM (TV_FIRST + 1) #define TVM_HITTEST (TV_FIRST + 17) 試してないので動かなかったらごめんなさい。
お礼
貴重なアドバイスをありがとう御座います。 以前にDOS時代のCやC++はやったんですが Windowsになってからちょっと離れていた為に 最近ではVisual言語についていけなくて・・・(涙) いまの時代VCは当たり前なんですよね。 やっぱり勉強しなければ! 頑張ります。ありがとう御座いました。
お礼
丁寧にご指導頂きありがとう御座いました。 とても勉強になりました。やってみましたが 上手くいきました。ポイントはRemoveだったの ですね。分かってしまえば簡単なんですが・・・ それを調べるのが下手なんでしょうね。私は。 一生懸命MSDNと向き合っているつもりなのですが! 本当にありがとう御座いました。