• ベストアンサー

TreeViewについて

いつも大変お世話になっております。福島です。 TreeViewのことで教えて頂きたいのですが・・・ 社員登録で3階層(部・課・社員)のツリー構造をなす TreeViewを作成しましたが、1社員の情報を変更したときに 状態を反映するためにTreeView全体を消去してから書き直しています。 (例えば)課や部を移動したとき しかし表示する数が多くなってきた為に再構築に非常に時間が かかってしまい実用的でなくなってしまいました。 あるノードの下だけ変更(削除)する方法はありますか? 今は、「treeView.Nodes.Clear」を使用して全体を削除して 再度ツリーを作成しています。 aNode(部) bNode(課) cNode(社員) のようになっています。 宜しくお願い申し上げます。 Windows2000SP2 + VB6.0SP4

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.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

Chika-F
質問者

お礼

丁寧にご指導頂きありがとう御座いました。 とても勉強になりました。やってみましたが 上手くいきました。ポイントはRemoveだったの ですね。分かってしまえば簡単なんですが・・・ それを調べるのが下手なんでしょうね。私は。 一生懸命MSDNと向き合っているつもりなのですが! 本当にありがとう御座いました。

その他の回答 (1)

  • sssohei
  • ベストアンサー率33% (33/98)
回答No.1

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) 試してないので動かなかったらごめんなさい。

参考URL:
http://www.kumei.ne.jp/c_lang/sdk2/sdk_114.htm
Chika-F
質問者

お礼

貴重なアドバイスをありがとう御座います。 以前にDOS時代のCやC++はやったんですが Windowsになってからちょっと離れていた為に 最近ではVisual言語についていけなくて・・・(涙) いまの時代VCは当たり前なんですよね。 やっぱり勉強しなければ! 頑張ります。ありがとう御座いました。

関連するQ&A