• ベストアンサー

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

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

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

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

>はい、その点はわかっております。 わかってくださったようでうれしいです。 tvwChild の上にカーソルがある状態で「F1キー」を押したら、MSDNに情報が出ませんか? 僕のMSDNは「ツリー ビュー (TreeView) コントロールの定数」というのが開きました。 >インターフェースを作るのが後回しになって、結局内部だけ作って、中途半端な状態で終わっちゃう わかります。その気持ち。。。 よく僕もあります。 僕も内部のパーツから作ります。画面なんてどうにでもなるし、パーツを作りこんでいるうちに最初リストビューにしようと思っていたことが、ツリービューの方がいいかもと思えることもあるので、画面を最初から作るはめに・・・なんてことがないようにしたいですしね。 まぁ何にせよ、がんばってください。

haporun
質問者

お礼

いろいろありがとうございました。 >わかります。その気持ち。。。 同じような方がいて嬉しいです。 また何かあったら、おねがいします。

その他の回答 (3)

noname#1504
noname#1504
回答No.4

下記のプログラムを実行してみて下さい。おおまかな組み立てかたは 分かるかと思います。 Dim nodX As Node TreeView1.LineStyle = tvwRootLines 'ツリービューの線のスタイルの設定 Set nodX = TreeView1.Nodes.Add(, , "r", "ルート1") '最初のノード追加 'ルート1の子ノードの追加 Set nodX = TreeView1.Nodes.Add("r", tvwChild, "child1", "子ノード1") Set nodX = TreeView1.Nodes.Add("r", tvwChild, "child2", "子ノード2") 'ルート2と子ノードの追加 Set nodX = TreeView1.Nodes.Add(, , "r2", "ルート2") Set nodX = TreeView1.Nodes.Add("r2", tvwChild, "child3", "子ノード")

haporun
質問者

お礼

だいたい理解しました。 tvwChild定数が鍵だったんですねぇ。 ありがとうございました。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

Addの文を見てください。 最初にAddしている「会社」以外はtvwChildが、引数に渡されています。 実行してみると、会社にぶら下がります。 それぞれのアイテムが、何にぶら下がっているかを注目してください。 そして各パラメータ値と対比させて見るようにしてください。 tvwChild は 宣言しないでもリストビューのコントロールが使用できるのであれば、リストビューを作成するライブラリに宣言されているので、特にプログラム内部での宣言は必要ありません。 ちなみにtvwChild = 4です。 この部分でエラーが起こるようであれば、もう一度コンポーネントを見直しましょう。 MSDNはネットにもあります。 http://www.microsoft.com/japan/developer/default.asp 「ツリー ビュー (TreeView) コントロールの使い方ツリー ビュー (TreeView) コントロールの使い方」 上記のカギカッコ内の文字列をキーにして、検索をしてみてください。 あのサンプル以上にわかりやすく説明することは、ちょっと無理です。。。 >新しいMSDNライブラリにはその部分が抜けているのではないか(リストにない)という結論に至った そんなことはないと思うのですが。。。貼り付けたコントロールをクリックしアクティブ状態にして、[F1キー]を押したら、よほどマイナーなコントロールでない限り、そのコントロールのヘルプが出ます。 それはご存知ですか? 勉強方法はいろいろありますが、主にサンプルがあったときは、それをコピってプロジェクトを作成し、いろいろ改造してみることが必要です。さっきのサンプルをいろいろ改造してみましたか? もめる気はないですが、、、 あなたの気持ちもわからないではないけど、あの書き込みからはTodoさんが言うのも最もな気がします。 >初心者っぽい質問で申し訳ないのですが、 本当は自分は初心者ではないと言っているように聞こえます。 >プロセスとプロセスがもっているスレッドを、・・・・ やっていることは、VBをする人の中で、高度なことです。それをすでにしていますね。 このことから、それまでの過程がよくわからないので、言語上級者がヘルプを調べるのが面倒になって回答を求めてるようにとることもできます。 もう一度言いますが、、、もめる気はありません。。。 しかし僕自身もプロセスやスレッドの概念を持った方であれば、あのサンプルを調査したら理解できるように思います。 とりあえず、改造を行ってみて、どういう風にわからないかを指摘してもらえれば、それなりの回答を得られると思います。

haporun
質問者

お礼

すみません。 tvwChildが定数だとは気が付きませんでした。 オブジェクトブラウザはかなりのぞいたんですが、定数までは気が回りませんでした。 オブジェクトブラウザでのメソッドのプロトタイプがバリアント型だったので、何型がわからなかったのです。 >高度なことです プロセスとスレッドをクラスにしたり・・・。 自分でもコアなことやってると思ってます。 さて、知識も付いてきたことだし、そろそろ実用的なプログラムを作ろうかと思ったら、インターフェース部分の知識が極端に抜けてまして。 最近どうも、インターフェースを作るのが後回しになって、結局内部だけ作って、中途半端な状態で終わっちゃうことが多かったもんで。 >本当は自分は初心者ではないと 他のことはわかるのに、インターフェースの知識だけ欠けて、みたいな意識があって、このような不快にさせる表現を使ってしまったみたいです、すみません。 >もめる気はありません はい、その点はわかっております。 一応努力したという意思表示のつもりです。 いろいろつきあってくださってどうもありがとうございました。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

検索を活用しましょうね。 つい最近、追加/削除のサンプルを載せました。

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=213676
haporun
質問者

お礼

・・・いえ、これは検索して見たのですが、これは理解できませんでした。 >.Add "会社", tvwChild, "経理部", "経理部" >.追加 "親となる物のキー", 自分は子, "キー文字列", "TreeViewに表示するテキスト" この、"自分は子" ってのがわかりません。 tvwChildが以前にどこで宣言されているのかがわかりません。 型なども。 そのへんご指導おねがいします。

関連するQ&A

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

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

  • TreeViewの追加 C++Builder

    TreeViewが2つあるとします。 TreeView1へTreeView2のツリーを追加したい場合 どのようにすればよいでしょうか? TreeView2の複数のノードを追加したいのですが。 どなたか、お願いします。

  • C# TreeView 効率良いノード追加の仕方

    C# TreeViewについて質問させてください。 ノード(子ノード含む)を数万件以上登録する際に、効率の良い方法を教えて頂けないでしょうか? 実際のコードとは異なりますが、大まかに以下のような処理をメインスレッドで行っています。 class MyTreeNode : TreeNode{   void AddNode(){     BeginUpdate();     SuspendLayout();     foreach( var 親ノード情報 in 親ノード情報リスト ){       TreeNode parentNode = new TreeNode( 親ノード名 );       foreach( var 子ノード情報 in 子ノード情報リスト ){         TreeNode childNode = new TreeNode( 子ノード名);         parentNode.Nodes.Add( childNode );       }       this.Nodes.Add( parentNode );     }     ResumeLayout();     EndUpdate();   } } この方法ですと、かなり時間がかかってしまい、UIが固まったようになってしまいます。 (TreeViewに、子ノードの一斉展開機能が必要なので、親ノード展開時のイベントを拾って  子ノードを追加する方法は上記と同じく遅くなってしまうのではと思っていますがどうなんでしょうか?)

  • 親のIDのあるデータをツリー状に並べたい

    @data=( '1<><>あああああ', '2<><>いいいいい', '3<>1<>ううううう', '4<>3<>えええええ', '5<>2<>おおおおお', ); このような <>で区切ったデータがあるとします。 一番左の数字は、そのデータのIDで、その次の数字は、 その親データのIDです。 このデータを、 1<><>あああああ  3<>1<>ううううう   4<>3<>えええええ 2<><>いいいいい  5<>2<>おおおおお のようなツリー形式に並べたいのです。 []を1つのノードと考えた $nodes=['1<><>あああああ',['3<>1<>ううううう',['4<>3<>えええええ']],'2<><>いいいいい',['5<>2<>おおおおお']]; のような配列を作れれば、 $nodes=['1<><>あああああ',['3<>1<>ううううう',['4<>3<>えええええ']],'2<><>いいいいい',['5<>2<>おおおおお']]; sub tree{ my($i); my $depth = shift; my $ref = shift; foreach(@{$ref}) { if (ref($_) eq "ARRAY") { &tree($depth+1, $_); } else { for($i=0;$i<$depth;$i++){ print " "; } print $_."\n"; } } } &tree(0,$nodes); というコードでツリーにできるところまではできました。 ですが、 @dataから$nodesを作る方法がわからず困っています。 $nodesは多少違うものでも構いませんので、 何かいい方法があれば教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Oracle階層問合せよりツリーノードを作成

    Oracle階層問合せの結果よりVB.NETのTreeViewを作成する方法を教えてください。 ・階層問合せのサンプル SELECT LPAD(' ', 2*level-1)||SYS_CONNECT_BY_PATH(last_name, '/') "Path" FROM employees START WITH last_name = 'Kochhar' CONNECT BY PRIOR employee_id = manager_id; Path --------------------------------------------------------------- /Kochhar /Kochhar/Greenberg /Kochhar/Greenberg/Faviet /Kochhar/Greenberg/Chen /Kochhar/Greenberg/Sciarra /Kochhar/Greenberg/Urman /Kochhar/Greenberg/Popp /Kochhar/Whalen /Kochhar/Mavris /Kochhar/Baer /Kochhar/Higgins /Kochhar/Higgins/Gietz VB.NET作成途中 Dim LEVEL_prev As Integer = 0 Dim node_prev As New TreeNode("") Dim aryNODENO(16) As Integer While (reader.Read()) NODE_NO = reader.Item("NODE_NO") LEVEL = reader.Item("LEVEL") PATH = reader.Item("PATH") NAME = reader.Item("NAME") Dim i As Integer Dim node_cur As New TreeNode("") node_cur.Expanded = True node_cur.Text = strSITE_NAME If intNODE_NO = 1 Then ' 新規ノードを準備する TreeView2.Nodes.Add(node_cur) Else If intLEVEL_prev < intLEVEL Then ' 下位層へ移動の場合、新規ノードを準備する TreeView2.Nodes(aryNODENO(intLEVEL - 1) - 1).ChildNodes.Add(node_cur) ElseIf intLEVEL_prev = intLEVEL Then '前のノードと同一階層 ' 前のノードを上位階層へ追加 TreeView2.Nodes(aryNODENO(intLEVEL - 1) - 1).ChildNodes.Add(node_cur) ElseIf intLEVEL_prev > intLEVEL Then ' '' 上位層へ移動の場合 '' ' ノードを上位階層へ追加 TreeView2.Nodes(aryNODENO(intLEVEL - 1) - 1).ChildNodes.Add(node_cur) End If End If intLEVEL_prev = intLEVEL node_prev = node_cur End While     Me.TreeView2.Nodes(0).Expand() 以上

  • 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
  • TreeViewについて

    TreeViewを使う場合、その管理情報(親ノードのIDとかKeyとか。。子ノードの情報とか、、)をテーブルに保存しておくと便利な気がするのですが、TreeViewを使う場合の基本(テーブル作成時)みたいなのを教えてもらえませんでしょうか?

  • コンテキストメニュークリック時のイベントハンドラ

    C#にてフォームアプリを作成しています。 そこでツリービューに表示されたノードを右クリックしたときにコンテキストメニューが表示される ように下記のように記述しました。表示されたノードの上で右クリックすると「Export」、「Import」 というメニューが表示されます。 しかし、イベントハンドラの書き方がよくわかりません。 「Export」又は「Import」がクリックされたというイベントはどう検出すればよいでしょうか。 // ノード右クリック時の動作 private void treeView1_MouseDown(object sender, MouseEventArgs e) { // 右クリックでもノードを選択させる if (e.Button == MouseButtons.Right) { // ノードの選択 treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y); // コンテクストメニューの作成 ContextMenuStrip contextMenu = new ContextMenuStrip(); ToolStripMenuItem openLabel = new ToolStripMenuItem(); openLabel.Text = "Export"; ToolStripMenuItem deleteLabel = new ToolStripMenuItem(); deleteLabel.Text = "Import"; contextMenu.Items.Add(openLabel); contextMenu.Items.Add(deleteLabel); // ツリービューにコンテキストメニューを追加 treeView1.ContextMenuStrip = contextMenu; } }

専門家に質問してみよう