いつも大変お世話になっております。福島です。

TreeViewのことで教えて頂きたいのですが・・・

社員登録で3階層(部・課・社員)のツリー構造をなす
TreeViewを作成しましたが、1社員の情報を変更したときに
状態を反映するためにTreeView全体を消去してから書き直しています。
(例えば)課や部を移動したとき
しかし表示する数が多くなってきた為に再構築に非常に時間が
かかってしまい実用的でなくなってしまいました。

あるノードの下だけ変更(削除)する方法はありますか?

今は、「treeView.Nodes.Clear」を使用して全体を削除して
再度ツリーを作成しています。

aNode(部)
bNode(課)
cNode(社員)

のようになっています。

宜しくお願い申し上げます。

Windows2000SP2 + VB6.0SP4

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/02/08 11:07

VBのコントロールにはメソッドがないようなのですが



C++ではマクロの TreeView_DeleteItem を使用すれば可能なようです。

英語のMSDNにしか記載されてないようですが^^;
http://msdn.microsoft.com/library/en-us/shellcc/ …

内部的に TVM_DELETEITEM メッセージをツリービューに送る様なので、SendMessageで代用出来きます。
http://msdn.microsoft.com/library/en-us/shellcc/ …

lParam にはHitTestの結果を渡せばよいと思います。
http://msdn.microsoft.com/library/en-us/shellcc/ …

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/02/08 11:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

今、見られている記事はコレ!

おしトピ編集部からのゆる~い質問を出題中

お題をもっとみる

このQ&Aを見た人が検索しているワード


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ