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

このQ&Aのポイント
  • C#でtreeviewの指定ノードを選択する方法について説明します。
  • 選択ノードを記憶しておき、treeviewを更新・再作成後に再び選択する方法について説明します。
  • TopNode選択状態になってしまい、最初に選択していたNodeが選択されない問題について解決方法を探しています。
回答を見る
  • ベストアンサー

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

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

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

  • ベストアンサー
回答No.1

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

nanigashik
質問者

お礼

なるほど。 フルパスを使って試みてみます。 ありがとうございました。

関連するQ&A

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

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

  • .NetのTreeViewの使い方について

    TreeView配下にTreeNodeを作成・表示した際に、ノードをクリックすると自動的にリバース表示されますが、これを止めることはできないでしょうか。 TreeView1   -Node0      -Node01      -Node02      -Node03   -Node1      -Node11      -Node12 のようになっているとき、たとえばNode01がクリックされたらNode0,Node01,Node02,Node02のすべてのForeColorをColor.Redにするなどして、まとまりのあるものとして認識させたいのですが、リバース表示が邪魔です。TreeViewやNodeのプロパティ、メソッドも調べてみましたが、それらしいものがありません。 OS:Windows7 (Home) 言語:VisualStudio 2010(VidsualBasic) よろしくお願いいたします。

  • 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に、子ノードの一斉展開機能が必要なので、親ノード展開時のイベントを拾って  子ノードを追加する方法は上記と同じく遅くなってしまうのではと思っていますがどうなんでしょうか?)

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

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

  • 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

  • .NETのTreeViewの項目が一つの場合の画面遷移

    .NETのTreeViewの項目が一つの場合の画面遷移がうまくできません。 'Dim Node As TreeNode 'Dim form2 As New あああ 'Node = TreeView2.SelectedNode 'Select Case Node.Text ' Case "あああ" ' form2.Show() ' Me.Hide() 'End Select とすると、他画面から、TreeViewを経由して遷移させたくても、TreeView内に一つしか選択要素がない場合の画面へは行かず、すぐ上のTreeView内にいくつもの選択要素がある画面へ飛んでしまいます。 単体で動かしたくても、TreeView内に選択項目が一つの場合は動きません。 どなたか、回避する方法をご存知の方お教えください

  • ASP.NET2.0 TreeView チェックボックス

    皆様、お世話になります。 長田と申します。 環境はASP.NET2.0です。 1.新規にWebフォームを作成して、その中にTreeViewとボタンを作成します。 2.TreeViewはチェックボックスを持つように設定。 3.ボタン押下時にTreeViewの中でチェックボックスを選択されているものを取得して、ラベルに表示。 ネットにてサンプルを見つけたのですが、C#なため解読できません。(泣く VB.NETでしたらどのようになりますでしょうか宜しければご教授頂きたく思ってます。 ご指導お願い致します。 TreeViewイメージ □大分類A  □中分類1   □小分類1   □小分類2   □小分類3  □中分類2   □小分類1   □小分類2   □小分類3 □大分類B  □中分類1   □小分類1 コード(※ツリービューを作る所は省略) //ボタン押下時 protected void Button1_Click(object sender, EventArgs e) {   System.Text.StringBuilder sb = new System.Text.StringBuilder();   //大分類   sb.Append(SelectNode(TV1.Nodes));   foreach (TreeNode tn in TV1.Nodes)   {     //中分類     sb.Append(SelectNode(tn.ChildNodes));     foreach (TreeNode tn2 in tn.ChildNodes)     {       //小分類       sb.Append(SelectNode(tn2.ChildNodes));     }   }   Label1.Text = sb.ToString(); } //ノードに日もづく子ノードで且つ選択されているものを取得 public static string SelectNode(TreeNodeCollection tnc) {   System.Text.StringBuilder sb = new System.Text.StringBuilder();   foreach (TreeNode tn in tnc)   {     if (tn.Checked)     {       sb.Append(tn.Text);     }   }   return sb.ToString(); }

  • 新しいノード

    TreeViewで新しいノードを作成した時、 その新しくできたノードを選択状態にするには どうすればいいのでしょうか? Lastノード、Nextノードを使ってみたのですが、 うまく取得できませんでした。 お願いします。 開発環境はVB.Net2003です。

  • 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() 以上

専門家に質問してみよう