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

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【C#】TreeViewでクリックした親ノードと、子ノードを表示させた

【C#】TreeViewでクリックした親ノードと、子ノードを表示させたい

C#初心者です。
TreeView(treeView1)で親ノードをクリックしたら、その親ノード+子ノードを、別のTreeView画面(treeView2)に表示させたいのですが、やり方がわかりません。
例えば、

+A
 -B
 -C
+D
 -E

というTreeViewの場合、Aの親ノードをクリックしたら、Aの親ノードと、BとCの子ノードが、別画面(treeView2)に表示されるようにしたいです。
どなたか分かる方いらっしゃいましたら教えていただけると幸いです。
宜しくお願いいたします。

Aベストアンサー

あまり詳しくはないのですが、ノードのサブツリーを含めたコピーはCloneメソッドを使うと簡単そうです。

「C# treenode clone」などで検索すると様々なサンプルが得られます。少し考えて下記のコードでできたと思います。

Windows7 + Visual C# 2010 Expressで試しています。

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
TreeNode CloneNode = (TreeNode)e.Node.Clone();
treeView2.Nodes.Clear();
treeView2.Nodes.Add(CloneNode);
treeView2.Nodes[0].Expand(); // rootを展開
}

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

QC#でtreeviewの指定ノードを選択する

C#にて、
treeviewでの選択ノードを記憶しておき、
treeviewを一度更新(削除し作成)し、
記憶してあるノードを再び選択する。という動きをしたいです。

TreeNode tn = new TreeNode();
tn = treeView1.SelectedNode;

//ここでDB再読み込み→treeView再作成

treeView1.Focus();
treeView1.SelectedNode = tn;

としているのですが、TopNode選択状態になってしまい、
最初に選択していたNodeを選択してくれません。


どなたかご教授願います。
よろしくお願いいたします。

Aベストアンサー

TreeViewを再作成した時点で、ノードのインスタンスがすべて新しく作り変えられているので、再作成前のノードで選択させることはできません。

再作成前に選択ノードのフルパスを記憶しておいて、作成後にフルパスを辿って選択させることならできます。フルパスを辿るのは自力になるかと。記憶したフルパスをPathSeparatorでSplitしてルートから順に子ノードを探していく方法くらいしか思いつきませんが・・・。
ただ、同じ階層に同じテキストのノードがあると破たんします。

QTreeViewで複数ノードの選択は可能ですか?

VisualBasic2005でwindowsアプリの開発をしています。

今回希望として、複数のノードを一度にドラッグするというのがあるのですが、
TreeViewで複数ノードの選択は可能なのでしょうか?
そして、もし可能な場合、それらを一気にドラッグということは可能でしょうか?
ドロップ先では、ドラッグ中のノードのtextが取れればよいです。

よろしくお願いします。

Aベストアンサー

TreeViewをカスタマイズすれば出来ます。

C#のサンプルがありますので参考にしてみてはどうでしょうか
http://www.codeproject.com/cs/miscctrl/mwcontrols.asp

QTreeViewのノードの編集結果が反映されない

C#3.5を使用しています。

treeView1にはnameが「ノード1」のノードがセットされていて、
それを次のようにして

TreeNode newNode;
newNode = new TreeNode(treeView1.SelectedNode.Name);
newNode.Text = "ノードテキスト変更";
treeView1.SelectedNode = newNode;
MessageBox.Show(treeView1.SelectedNode.Text);// ノード1のまま・・・

ノードを編集したと思ったのですがノードのテキストは変更されませんでした。
間に直接

treeView1.SelectedNode.Text = newNode.Text;

を入れるとテキストは変更されるのですが、ノードそのものを入れ替える(編集する)には
どのように記述すれば良いのでしょうか?

C#3.5を使用しています。

treeView1にはnameが「ノード1」のノードがセットされていて、
それを次のようにして

TreeNode newNode;
newNode = new TreeNode(treeView1.SelectedNode.Name);
newNode.Text = "ノードテキスト変更";
treeView1.SelectedNode = newNode;
MessageBox.Show(treeView1.SelectedNode.Text);// ノード1のまま・・・

ノードを編集したと思ったのですがノードのテキストは変更されませんでした。
間に直接

t...続きを読む

Aベストアンサー

 こんばんは。

 新規ノードを追加した後、選択ノードを引っこ抜かないといけないのではないでしょうか。
 新規ノードを追加する際、ツリーの形状を辿って適切な位置に入れないといけないので、再帰を使って話を進めた方が楽かもしれません。
 速度面等、色々とアラはあると思いますが、以下参考程度に。

private bool SwapTreeNode(TreeNodeCollection tvnc, TreeNode selectedNode, TreeNode newNode)
{
for (int n = 0; n < tvnc.Count; ++n)
{
//選択ノードを発見
if (tvnc[n] == selectedNode)
{
//新規ノードを追加
tvnc.Insert(n, newNode);
return true;
}

//+1階層下へ再帰する
if (SwapTreeNode(tvnc[n].Nodes, selectedNode, newNode))
return true;
}
return false;
}

private void ???()
{
//新規ノード作成
TreeNode newNode = new TreeNode(treeView1.SelectedNode.Name);
newNode.Text = "ノードテキスト変更";

//ツリー形状を辿って選択ノードの位置を見つけて新規ノードを追加
SwapTreeNode(treeView.Nodes, treeView.SelectedNode, newNode);

//選択ノードを引っこ抜く
treeView.SelectedNode.Remove();

//新規ノードを選択する
treeView.SelectedNode = newNode;

//確認
MessageBox.Show(treeView1.SelectedNode.Text);
}

 こんばんは。

 新規ノードを追加した後、選択ノードを引っこ抜かないといけないのではないでしょうか。
 新規ノードを追加する際、ツリーの形状を辿って適切な位置に入れないといけないので、再帰を使って話を進めた方が楽かもしれません。
 速度面等、色々とアラはあると思いますが、以下参考程度に。

private bool SwapTreeNode(TreeNodeCollection tvnc, TreeNode selectedNode, TreeNode newNode)
{
for (int n = 0; n < tvnc.Count; ++n)
{
//選択...続きを読む

QTreeVIewのノード名を編集する際、編集できる文字を制御したい

TreeViewのノードを編集する際、例えば、ノード名の後ろ2文字は編集せない、といったことをやりたいと思っています。

TreeViewのノードにファイル名を表示させています。ノード名が変更されたら、その名前をローカルのファイル名に反映させるつもりです。しかし、ファイル名の後ろ2文字に特別な意味があり、この2文字をユーザに編集させない処理ができないか模索しています。

何かよい方法はないでしょうか?

開発環境
Visual Basic 2008
.NET FrameWord 2.0
Windows XP SP2

Aベストアンサー

文字列から最後の2文字を抜くのは BeginEditメソッド呼ぶときの方がいいようです

何かのアクション条件下でBeginEditを使う前に

sLast = objNode.Text.SubString( objNode.Text.Length - 2 )
objNode.Text = objNodeText.SubString(0, objNode.Text.Length -2 )
objNode.BeginEdit()
といった具合にします
# objNodeが編集するノード、変数sLastは最後を覚えておくClassレベルの変数です

編集が終わったときの処理 TreeView1_AfterLabelEdit イベントで
if e.Label isnot nothing then
  TreeView1.LabelEdit = False
  e.Node.EndEdit( False )
  e.Node.Text = e.Label & sLast
  ' これが無いと ラベルの内容がイベント終了後にe.Labelに戻ってしまう
  e.CancelEdit = True
else
  ' これが無いと編集モードにならない …
  e.Node.BeginEdit()
end if
といった具合でよさそうです

BeforeLabelEdit側での処理は複数回呼ばれてしまうのでうまくないようです
ただ、編集中に他のノードを選択した際の動作を制御する必要があると思います
また、この実装の場合何も編集しなかった場合も動作がおかしくなるようです … 編集モードから抜けれない状況になります

文字列から最後の2文字を抜くのは BeginEditメソッド呼ぶときの方がいいようです

何かのアクション条件下でBeginEditを使う前に

sLast = objNode.Text.SubString( objNode.Text.Length - 2 )
objNode.Text = objNodeText.SubString(0, objNode.Text.Length -2 )
objNode.BeginEdit()
といった具合にします
# objNodeが編集するノード、変数sLastは最後を覚えておくClassレベルの変数です

編集が終わったときの処理 TreeView1_AfterLabelEdit イベントで
if e.Label isnot nothing then
  TreeVie...続きを読む

Qtree planting って何でしょうか?

以前、日本に住んでいた(3年ほど)友人(隣に住んでいたアメリカ人)から、昨日、メールが届きました。

タイトルに
(友人の名前) has reserved a special tree planting for you!
Would you like to plant your tree now?

と書かれてあって、

その下に
When you plant (友人) has reserved for you, a real tree will be planted on your behalf through the non-profit group Trees for the Future

Trees for the Future has planted over 50 million trees since 1988!

とありました。
私も主人も英語はあまり知らないので
英語に詳しい方教えてください。


Yes, plant this tree! という文字をクリックして
いいのでしょうか?

Aベストアンサー

#2,3ですが、私の言わんとすることが伝わっていなかったようですのでもう一度書かせていただきます。
私が思うに、今回の件ではおそらくお友達も被害者なわけですよね。
質問者さんも今回クリックしていたら、質問者さんのアドレスブックに入っている人のところにメールが行っていたわけですし、もしかしたらお友達はクリックすらしていなくて、別の人のアドレスブックにお友達のアドレスが入っていて、そこから芋づる式にあちこちにパッと広まったのかもしれません。

とにかく、これは無視するに限ると思います。#4の方のお礼欄でお書きになってるような「断りのメールを入れる」ということなどは一切しない方がいいのでは。そうすれば今度は決定的に質問者さんのアドレスが向こうに登録されてしまうことになるのかもしれませんから、いいことは何もないように思います。

もし何でしたら、こちらでの質問を締め切ってカテゴリを「デジタルライフ」の「E-Mail」などにして、再度質問を立ててみてはいかがでしょう。
英語の問題よりも、まずはそっち方面から入った方がいい回答を得られるはずです。

#2,3ですが、私の言わんとすることが伝わっていなかったようですのでもう一度書かせていただきます。
私が思うに、今回の件ではおそらくお友達も被害者なわけですよね。
質問者さんも今回クリックしていたら、質問者さんのアドレスブックに入っている人のところにメールが行っていたわけですし、もしかしたらお友達はクリックすらしていなくて、別の人のアドレスブックにお友達のアドレスが入っていて、そこから芋づる式にあちこちにパッと広まったのかもしれません。

とにかく、これは無視するに限ると...続きを読む

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この場合のtreeの意味

automated phone-tree systemのtreeはどんな意味があるのでしょうか。

Aベストアンサー

telephone treeとは『電話連絡網』のことです。電話連絡網は連絡者経路を枝分かれする木の枝のように書くのでtreeという言葉が使われる訳です。phone treeをgoogle画像検索してみるとよく分かります。

http://eow.alc.co.jp/search?q=%E9%9B%BB%E8%A9%B1%E9%80%A3%E7%B5%A1%E7%B6%B2

蛇足ですが質問の言葉は automated systemとありますからコンピュータが自動で電話連絡するシステムのことです。

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

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

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

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

よろしくお願いします。

Aベストアンサー

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


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

人気Q&Aランキング

おすすめ情報