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

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

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

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

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

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

のようになっています。

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

Windows2000SP2 + VB6.0SP4

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

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

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

このQ&Aと関連する良く見られている質問

Qツリービューの使い方が・・・

VBのカスタムコントロールはほとんどさわったことがないので、ぜんぜんわからないです。
初心者っぽい質問で申し訳ないのですが、プロセスとプロセスがもっているスレッドを、プロセスID&スレッドIDをキーにツリー構造を持たせたいのですが、ツリービューのツリーへのアクセスのしかたがわかりません。
MSDNライブラリが壊れているようで、ヘルプが出ないのです。
新しいMSDNライブラリ入れてから、トラブル続き。

TreeView1.Nodes.Add , , "キー", "値"
TreeView1.Nodes.Add , , "キー\サブキー", "値"

じゃなさそうみたいです。

かといってそれぞれのノードが小枝への参照をもっているわけでもないし、小枝を追加するメソッドをもっているわけでもないし。

単純に小枝への追加のしかたが知りたいだけなんですけど・・・。
だれか教えてください。

Aベストアンサー

>はい、その点はわかっております。
わかってくださったようでうれしいです。

tvwChild の上にカーソルがある状態で「F1キー」を押したら、MSDNに情報が出ませんか?
僕のMSDNは「ツリー ビュー (TreeView) コントロールの定数」というのが開きました。

>インターフェースを作るのが後回しになって、結局内部だけ作って、中途半端な状態で終わっちゃう
わかります。その気持ち。。。
よく僕もあります。

僕も内部のパーツから作ります。画面なんてどうにでもなるし、パーツを作りこんでいるうちに最初リストビューにしようと思っていたことが、ツリービューの方がいいかもと思えることもあるので、画面を最初から作るはめに・・・なんてことがないようにしたいですしね。

まぁ何にせよ、がんばってください。

QTreeView の初期表示について

TreeView に『A』『B』『C』のノードがあるとします。
初期表示を『B』ノードを選択・展開した状態(子ノードあり)にしたいのですが、
方法がわかりません。
何かよい方法はないでしょうか?よろしくお願いします。
説明不足な点はすぐに補います。

Aベストアンサー

'ノードの追加
Call TreeView1.Nodes.Add(, , "a", "A")
Call TreeView1.Nodes.Add("a", tvwChild, "b", "B")
Call TreeView1.Nodes.Add("b", tvwChild, "c", "C")

'ノードの展開
TreeView1.Nodes("a").Expanded = True
TreeView1.Nodes("b").Expanded = True

'ノードの選択
TreeView1.Nodes("b").Selected = True

上のコードで知りたいことはあっていますか?

QTreeViewコントロールについて

いつも参考にさせて頂いてます。

早速ですが、DBの値をTreeViewを使用して表示したいと思っています。
DBには、
CD   機能1  機能2  機能3
CD1   A1   B1    C1
CD1   A1   B2    C2
CD1   A1   B2    C3
CD2   A2   B3    C4

見たいな感じでデータが登録されています。
これをTreeViewに、
CD1
 LA1
   LB1
   | LC1
   LB2
     LC2
     LC3
CD2
 LA2
   LB3
     LC4
と出力させたいのですが、どうしたらよいか見当もつきません。
いろいろ調べて再帰呼び出しで出来るんじゃないかと思うのですが、
再帰処理にに詳しくない為、先に進むことが出来ません。

どうしたら実現できるか、力をお貸しください。
宜しくお願い致します。

Aベストアンサー

No.2 です。

> 'System.Web.UI.WebControls.~~'

すいません。TreeViewって、Windowsアプリの TreeView (System.Windows.Forms.TreeView) ではなかったのでしょうか?私すっかりWindowsアプリだとばっかり考えておりました。すみません。。。

上記のクラスをお使いということは、Web アプリ(ASP.NET?)でしょうか。であれば、私は門外漢なので、お答えできません(^^;。

ASP.NET はよく知らないのですが、取り急ぎ、ASP.NETでの TreeView 作成に参考になりそうなサイトだけ見つけたので書いておきます。以下のサイトから、「IE WebBrowserコントロール」の、「TreeView」に関する記述をご参照ください。

http://www.atmarkit.co.jp/fdotnet/dotnettips/index/index.html

また、ASP.NET には 以下のカテがあり、そちらの方がご回答いただけると思いますので、カテを変えてご質問されることをお勧めいたします。

プログラミング > Microsoft ASP
http://oshiete1.goo.ne.jp/c249.html

お役に立てずすみません。

No.2 です。

> 'System.Web.UI.WebControls.~~'

すいません。TreeViewって、Windowsアプリの TreeView (System.Windows.Forms.TreeView) ではなかったのでしょうか?私すっかりWindowsアプリだとばっかり考えておりました。すみません。。。

上記のクラスをお使いということは、Web アプリ(ASP.NET?)でしょうか。であれば、私は門外漢なので、お答えできません(^^;。

ASP.NET はよく知らないのですが、取り急ぎ、ASP.NETでの TreeView 作成に参考になりそうなサイトだけ見つけたので書いておきます...続きを読む

QVB2005 TreeViewの任意ノード選択

お世話になっております。

VB2005でWinアプリを開発中です。
ルートノードは1つで、
そこから子、孫、ひ孫・・・と階段状になるTreeViewを作っています。

  L子
     L孫
        Lひ孫
            ・・・・

このようなツリーに対し、プログラムで任意のノードを選択状態にしたいのですが、
ノードの名称などで一発で指定する方法はありますでしょうか??
上の例で、「孫」を選択状態にしたい場合、
TreeView1.SelectedNode = TreeView1.Nodes(0).Nodes(0).Nodes(0)
と書けば、できることはできるのですが。
他にもっとよい方法があるはずと思うのですが、見つけられませんでした。

VB6.0なら、下記に方法があったのですが・・・
http://oshiete1.goo.ne.jp/qa732490.html

よろしくお願いします。

Aベストアンサー

参考URLです。
http://homepage1.nifty.com/rucio/main/dotnet/Samples/SmpleCnt.htm

QACCESS ツリービューの作り方

お願いします。

ACCESS2003で、ツリービューを作りたいですが、なかなかうまくいきません。
「T部屋マスタ」というテーブルの「部屋名」フィールドを親、
「Q商品マスタ」というクエリの「プラン名」フィールドを子として設定し、
子をクリックすると、その詳細が表示される「F商品マスタ」フォームを起動させたいです。

「T部屋マスタ」には、「部屋名」「部屋コード」というフィールド、
「Q商品マスタ」には、フィールドがたくさんあるので、関係のありそうなものだと「商品コード」「プラン名」あたりかとおもいます。

初心者ですみません…。
この情報だけでわかるか心配ですが、
ご回答お願いします!

Aベストアンサー

No5の最初の部分について少し訂正です。

「T部屋マスタ」
部屋コード(数値型、あるいはオートナンバー)
部屋名

として、

「T商品マスタ」
商品コード(数値型、あるいはオートナンバー、主キーとしていない)
商品名
部屋コード(数値型)
部屋名

としています。
「T商品マスタ」は「T部屋マスタ」の部屋別に
同じ商品名が存在する可能性があるかもしれない、
という想定にしています。つまり

「T部屋マスタ」
部屋コード  部屋名 
1       部屋A
2       部屋B
3       部屋C


「T商品マスタ」
商品コード 商品名 部屋コード 部屋名
1     プランA  1     部屋A
2     プランB  1     部屋A
3     プランB  2     部屋B
4     プランC  2     部屋B
5     プランC  3     部屋C
6     プランD  3     部屋C

のようなデータではないか、ということです。

さらに、このTreeに他のテーブルのフィールドを
載せるのならば、他のテーブルと「T部屋マスタ」
の関係、あるいは「T商品マスタ」との関係が
明確であること、すなわち部屋コードや部屋名が
ある、あるいは商品コードがある、のどちらかならば
Treeにフィールドを追加できます。ただ、
「Q商品」はどのようなTreeeを形成するために
作成したのか、ただテーブルがこのようにありますと
示されても上記のような設計になっているのか
分からないので、そのまま「Q商品」のフィールドを
ノードに追加していっても意図したTreeになる
ということはまったく保証できません。

TreViewを設定するときはデータの設定、
つまりテーブルの設計と親子関係を
明確にするフィールドの設定が非常に
重要で、アバウトな設計ではTreeViewは
形成できません。

No5の最初の部分について少し訂正です。

「T部屋マスタ」
部屋コード(数値型、あるいはオートナンバー)
部屋名

として、

「T商品マスタ」
商品コード(数値型、あるいはオートナンバー、主キーとしていない)
商品名
部屋コード(数値型)
部屋名

としています。
「T商品マスタ」は「T部屋マスタ」の部屋別に
同じ商品名が存在する可能性があるかもしれない、
という想定にしています。つまり

「T部屋マスタ」
部屋コード  部屋名 
1       部屋A
2       部屋B
3       部屋C


「T商品...続きを読む

QTreeViewに重複する値をセット

VB2005Expressで開発しています。

TreeViewにデータテーブルの値をセットして表示しています。
セットする値に重複する値がある場合、ツリーの構造が崩れてしまいます。左図のようにしたいのですが、右図のようになってしまいます。
あ あ
|-い |-い
| | | |
| -う | -う
お | -え
|-い お
| |
| -え
ツリーの値に非表示のキーを持たせる等、何か対応法をご存知の方が
いらっしゃいましたら教えて下さい。下記がPGMです。

'処理内容:TreeViewにデータテーブルの値をセット
Private Function fncTreeViewSet() As Boolean
Dim dTbl As DataTable
Dim Node As TreeNode
Dim intMenuNo As Integer
Dim strMenuName1 As String
Dim strMenuName2 As String
Dim strMenuName3 As String
Dim strMenuName4 As String
Dim strMenuName5 As String
Dim i As Integer

Node = TreeView1.SelectedNode
dTbl = dsDataSet.Tables("Mメニュー")

For i = 0 To dTbl.Rows.Count() - 1
intMenuNo = 0
strMenuName1 = ""
strMenuName2 = ""
strMenuName3 = ""
strMenuName4 = ""
strMenuName5 = ""

strMenuName1 = Trim$(dTbl.Rows(i)("階層1"))
intMenuNo = dTbl.Rows(i)("工程番号")
strMenuName2 = Trim$(dTbl.Rows(i)("階層2").ToString)
strMenuName3 = Trim$(dTbl.Rows(i)("階層3").ToString)
strMenuName4 = Trim$(dTbl.Rows(i)("階層4").ToString)
strMenuName5 = Trim$(dTbl.Rows(i)("階層5").ToString)

If strMenuName1 = "" Then
Else
If strMenuName2 = "" Then
TreeView1.Nodes.Add(strMenuName1) '階層1をセット
Else
If strMenuName3 = "" Then
fncSerchNode(strMenuName1)
TreeView1.SelectedNode.Nodes.Add(strMenuName2) '階層2をセット
Else
If strMenuName4 = "" Then
fncSerchNode(strMenuName2)
TreeView1.SelectedNode.Nodes.Add(strMenuName3) '階層3をセット
Else
If strMenuName5 = "" Then
fncSerchNode(strMenuName3)
TreeView1.SelectedNode.Nodes.Add(strMenuName4) '階層4をセット
Else
fncSerchNode(strMenuName4)
TreeView1.SelectedNode.Nodes.Add(strMenuName5)
End If
End If
End If
End If
End If
Next

TreeView1.SelectedNode = Nothing
End Function


'処理内容:指定ノード選択
Private Function fncSerchNode(ByVal strMenuName As String) As Boolean
Dim Node As TreeNode

For Each Node In fncGetAllNodes(TreeView1.Nodes)
If Node.Text = strMenuName Then
TreeView1.SelectedNode = Node
Exit For
End If
Next
End Function


'処理内容:子ノードも含んだすべてのノードを取得
Private Function fncGetAllNodes(ByVal Nodes As TreeNodeCollection) As ArrayList
Dim Ar As New ArrayList
Dim Node As TreeNode

For Each Node In Nodes
Ar.Add(Node)
If Node.GetNodeCount(False) > 0 Then
Ar.AddRange(fncGetAllNodes(Node.Nodes))
End If
Next

Return Ar
End Function

VB2005Expressで開発しています。

TreeViewにデータテーブルの値をセットして表示しています。
セットする値に重複する値がある場合、ツリーの構造が崩れてしまいます。左図のようにしたいのですが、右図のようになってしまいます。
あ あ
|-い |-い
| | | |
| -う | -う
お | -え
|-い お
| |
| -え
ツリーの値に非表示のキーを持たせる等、何か対応法をご存知の方が
いらっしゃいましたら教えて下さ...続きを読む

Aベストアンサー

fncSerchNodeで探しているノードが Node.Textとの比較でしか探していないのが原因でしょう

探すノードまでフルパスを検索してやれば希望通りになると思います
呼び出し側で 『階層5』を追加するための『階層4』ノードの検索に
fncSerchNode(strMenuName1 & "\" & strMenuName2 & "\" & strMenuName3 & "\" & strMenuName4)
と 階層1から階層4までを "\"でつないだ物をキーに探します

階層3を探すなら
fncSerchNode(strMenuName1 & "\" & strMenuName2 & "\" & strMenuName3)

階層2を探すなら
fncSerchNode(strMenuName1 & "\" & strMenuName2 )

階層1を探すなら
fncSerchNode(strMenuName1 )

fncSerchNodeのIf Node.Text = strMenuName Then を
If Node.FullPath = strMenuName Then
としてみてください

fncSerchNodeで探しているノードが Node.Textとの比較でしか探していないのが原因でしょう

探すノードまでフルパスを検索してやれば希望通りになると思います
呼び出し側で 『階層5』を追加するための『階層4』ノードの検索に
fncSerchNode(strMenuName1 & "\" & strMenuName2 & "\" & strMenuName3 & "\" & strMenuName4)
と 階層1から階層4までを "\"でつないだ物をキーに探します

階層3を探すなら
fncSerchNode(strMenuName1 & "\" & strMenuName2 & "\" & strMenuName3)

階層2を探すなら
fncSer...続きを読む

Qユーザーフォームを表示中にシートの操作をさせるには

ユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。
セルへの入力、画面のスクロールなどは、ユーザーフォームからマクロを実行させたり、.hideでユーザーフォームを一時的に隠すなどすればいいのでしょうが、そういう手段をとらないでユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。

Aベストアンサー

ユーザフォームの
ShowModalプロパティを
falseにすればよいかと。

QTreeViewのChild Node

任意のNodeのChild Nodeの 一覧を取得したいのですが、
これはどこでというかどうやると取得できるのでしょうか?


よろしくお願いします。

VB6+Windows2000です。

Aベストアンサー

再帰呼出を使って取得する方法が普通です。
例えば、

'Dim intNodesCount As Integer
'Dim nodChildren() As Node
'
'Sub GetAllNodeChildren(ByVal nodSetNode As Node)
' intNodesCount = 0
' Erase nodChildren
' Call GetNodeChildren(nodSetNode)
'End Sub
'Sub GetNodeChildren(ByVal ParentNode As Node)
'Dim nodX As Node
' For Each nodX In TreeView1.Nodes
' If nodX.Parent Is ParentNode Then
' intNodesCount = intNodesCount + 1
' ReDim Preserve nodChildren(1 To intNodesCount)
' Set nodChildren(intNodesCount) = nodX
' Call GetNodeChildren(nodX)
' End If
' Next
'End Sub
こんな感じでどうでしょう?

再帰呼出を使って取得する方法が普通です。
例えば、

'Dim intNodesCount As Integer
'Dim nodChildren() As Node
'
'Sub GetAllNodeChildren(ByVal nodSetNode As Node)
' intNodesCount = 0
' Erase nodChildren
' Call GetNodeChildren(nodSetNode)
'End Sub
'Sub GetNodeChildren(ByVal ParentNode As Node)
'Dim nodX As Node
' For Each nodX In TreeView1.Nodes
' If nodX.Parent Is ParentNode Then
' intNodesCount = intNodesCount + 1
' ...続きを読む

QVBAでドラッグ・アンド・ドロップ

エクスプローラからファイルを選択して、ワードもしくはエクセルにD&Dしファイル名を取得したいと思います。

VBだとOleDragDropでいけるようですが、VBAにはこのイベントがありません。

ということは、無理ってことなのでしょう赤?

Aベストアンサー

こんにちは。

Excelしかやったことがありませんが、エクスプローラを開いて、ドラッグ&ドロップすれば、ふつう、そのままでいけるはずですが?

それにチェック機能をつけるのでしたら、Office では、ユーザーフォームの[ツール]メニューの、[その他のコントロール]で、Microsoft Listview Control (SP4) があるかと思います。そのListview Control に 以下のように、OleDragDrop イベントをつければよいと思います。

以下のコードでは、Explorer は、自分で閉じてください。

Excelの場合。
サンプルコード

'<UserFormモジュール以外>
Sub uformShow()
Dim myPath As String, myID As Double
myPath = ThisWorkbook.Path
myID = Shell("Explorer.exe /e, /root," & myPath, vbNormalFocus)
If myID = 0 Then Exit Sub
UserForm1.Show 0
End Sub

'<ユーザーフォームモジュール>
Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, _
                 Effect As Long, Button As Integer, _
                 Shift As Integer, x As Single, y As Single)

Dim i As Long
With Me
  AppActivate Me.Caption
  .ListView1.ListItems.Clear
  If Data.Files.Count < 1 Then Exit Sub
  For i = 1 To Data.Files.Count
   If InStrRev(Data.Files(i), "xls") > 0 Then
    Workbooks.Open (Data.Files(i))
   Else
    MsgBox "Excelの標準ファイルではありません。", vbCritical
   End If
  Next i
End With
End Sub

Private Sub UserForm_Activate()
  With Me.ListView1
    .OLEDragMode = 1
    .OLEDropMode = 1
    .View = 2
  End With
End Sub

こんにちは。

Excelしかやったことがありませんが、エクスプローラを開いて、ドラッグ&ドロップすれば、ふつう、そのままでいけるはずですが?

それにチェック機能をつけるのでしたら、Office では、ユーザーフォームの[ツール]メニューの、[その他のコントロール]で、Microsoft Listview Control (SP4) があるかと思います。そのListview Control に 以下のように、OleDragDrop イベントをつければよいと思います。

以下のコードでは、Explorer は、自分で閉じてください。

Excelの場合。
サンプル...続きを読む

QTreeViewを反転表示したままTextBoxにカーソル

VB2005 Expressで開発をしています。

TreeViewでノードを選択して、その値をTextBoxに表示しようと
思っています。
そこで、選択したノードを反転表示したままTextBoxにカーソル
をセットすることは可能なのでしょうか。

フォーカスを当てた上体で反転されるので無理な気はするのですが、
ご存知の方がいらっしゃいましたら教えて下さい。

よろしくお願いします。

Aベストアンサー

TreeViewのHideSelectionをfalseに設定すれば フォーカスが外れても選択状態のままの表示になりますよ


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

人気Q&Aランキング