• ベストアンサー

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

  • VB2005 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 よろしくお願いします。

  • TreeViewに重複する値をセット

    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

  • TreeView と DOMツリー

    C# WPF でプログラミングをしています。 TreeView に XML の階層構造を表示させて、ある項目を選択し、ボタンをクリックするとその項目の子ノードが追加されるようにするプログラムを作っています。 選択した項目(TreeView.SelectedItem(Object型)) を、DOMツリーの要素ノード (XmlElement型) にキャストし、それに新しく作った要素ノード(XmlElement型)をつなげるといったようにしているのですが、その際「挿入するノードは、異なるドキュメント コンテキストのものです。」のエラーが発生してしまいます。 XmlElement tvi = treeView.SelectedItem as XmlElement; XmlElement item = doc.CreateElement("item"); tvi.PrependChild(item); // エラー発生箇所 ※ doc は XmlDocument のインスタンスです。 解決策を教えてください。よろしくお願いします。

    • ベストアンサー
    • XML
  • C#でtreeviewの指定ノードを選択する

    C#にて、 treeviewでの選択ノードを記憶しておき、 treeviewを一度更新(削除し作成)し、 記憶してあるノードを再び選択する。という動きをしたいです。 TreeNode tn = new TreeNode(); tn = treeView1.SelectedNode; //ここでDB再読み込み→treeView再作成 treeView1.Focus(); treeView1.SelectedNode = tn; としているのですが、TopNode選択状態になってしまい、 最初に選択していたNodeを選択してくれません。 どなたかご教授願います。 よろしくお願いいたします。

  • TreeViewのTag情報取得

    VB.NET2003 を使用して、 CheckBox付のTreeViewを作成しました。 階層は3階層用意して、最下層のTextに人名・Tagにメールアドレスをセットしました。 下記のサンプルの場合、チェックを入れたDさんのメールアドレスのみを 取得したいのですが、どのよう書けばよろしいでしょうか? ご教授いただけますよう、お願い致します。 TreeViewイメージ □本部  □総務課   □Aさん   □Bさん  □人事課   □Cさん   ■Dさん   □Eさん □営業  □東京   □Fさん   □Gさん TreeView作成コード Dim parentrow As DataRow Dim ParentTable As DataTable For Each parentrow In ds.Tables("A").Rows Dim parentnode As TreeNode parentnode = New TreeNode(parentrow.Item("SHOZOKU").ToString) treeView1.Nodes.Add(parentnode) ''''child''''' Dim childrow As DataRow Dim childnode As TreeNode childnode = New TreeNode For Each childrow In parentrow.GetChildRows("A") childnode = parentnode.Nodes.Add(childrow("BUSHO_NAME").ToString) ''''child2'''' Dim childrow2 As DataRow Dim childnode2 As TreeNode childnode2 = New TreeNode For Each childrow2 In childrow.GetChildRows("B") childnode2 = childnode.Nodes.Add(childrow2("NAME").ToString) childnode2.Tag = childrow2("MAIL").ToString Next childrow2 '''''''''''''''''''''''' Next childrow ''''''''''''''' Next parentrow treeView1.CheckBoxes = True

  • TreeViewのノードを選択 右メニュー変更

    こんにちは。添付画像にあるような事をしたいと思っています。 左側のメニューはtreeviewコントロールで作られていると思います。ツリーの各ノードを選択すると、右側の領域が変更されるようにしたいと思っているのですが、どういった方法を使えば実現できるのかお教え頂けませんでしょうか? コントロールを色々調べてみたのですが、該当するものがありませんでした。よろしくお願いいたします!

  • VB2005 ツリービューに子ノードを追加

    VB2005 ExpressEditionにて開発しています。 フォームロード時にデータセットからツリービューにデータをセット しようとしています。 ルートノードには  Dim Node As TreeNode  Node = TreeView2.SelectedNode  TreeView2.Nodes.Add("追加したい名前") で追加できます。 子ノードを追加する時はどうしたらいいのでしょうか。 ご存知の方がいらっしゃいましたら教えて下さい。 よろしくお願いします。

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

    VBのカスタムコントロールはほとんどさわったことがないので、ぜんぜんわからないです。 初心者っぽい質問で申し訳ないのですが、プロセスとプロセスがもっているスレッドを、プロセスID&スレッドIDをキーにツリー構造を持たせたいのですが、ツリービューのツリーへのアクセスのしかたがわかりません。 MSDNライブラリが壊れているようで、ヘルプが出ないのです。 新しいMSDNライブラリ入れてから、トラブル続き。 TreeView1.Nodes.Add , , "キー", "値" TreeView1.Nodes.Add , , "キー\サブキー", "値" じゃなさそうみたいです。 かといってそれぞれのノードが小枝への参照をもっているわけでもないし、小枝を追加するメソッドをもっているわけでもないし。 単純に小枝への追加のしかたが知りたいだけなんですけど・・・。 だれか教えてください。

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

    TreeViewのノードを編集する際、例えば、ノード名の後ろ2文字は編集せない、といったことをやりたいと思っています。 TreeViewのノードにファイル名を表示させています。ノード名が変更されたら、その名前をローカルのファイル名に反映させるつもりです。しかし、ファイル名の後ろ2文字に特別な意味があり、この2文字をユーザに編集させない処理ができないか模索しています。 何かよい方法はないでしょうか? 開発環境 Visual Basic 2008 .NET FrameWord 2.0 Windows XP SP2

  • TreeViewのCheckBoxについて

    はじめまして。 以下の環境で開発しています。 Visual studio 2005 Version 8.0.50727.867 (vsvista.050727-8600) .NET Framework Version 2.0.50727 SP2 Visual Basic 2005 TreeView(二階層限定)にCheckBoxを表示させて親ノードのCheckBoxをTrue/Falseすると その子ノードのCheckBoxも全部合わせてTrue/Falseするものを作ろうとしていますが、 CheckBoxクリック時のイベントが拾えません。 どなたかご存知の方がおられましたらご教授ください。 通常のCheckBoxであればPostBackが発生するのですが、TreeViewのCheckBoxにはそのような イベントがありません。 TreeNodeCheckChangedイベントはあるのですが、True/Falseが切り替わったあとにTreeView のラベル選択したときに発生する中途半端なイベントなので使えません。 http://msdn.microsoft.com/ja-jp/library/system.windows.forms.treeview.aftercheck(VS.80).aspx のヘルプからAfterCheckイベントを調べて試したのですが、 Imports System.Windows.Forms Public Event AfterCheck As TreeViewEventHandler を定義して、以下の関数を書いてみたのですが、 Private Sub node_AfterCheck(ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles TreeView1.AfterCheck ~中身~ End Sub 「イベントAfterCheckが見つかりません。」とコンパイルエラーとなります。 客先の開発環境なのでバージョンアップ等はできません。 どなたかCheckBoxクリック時のイベントの拾い方をご存知の方がおられましたらご教授お願いします。

専門家に質問してみよう