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

このQ&Aのポイント
  • C#3.5を使用しています。treeView1にはnameが「ノード1」のノードがセットされていて、ノードを編集したと思ったのですがノードのテキストは変更されませんでした。
  • treeView1.SelectedNode.Text = newNode.Text;を入れるとテキストは変更されるのですが、ノードそのものを入れ替える(編集する)にはどのように記述すれば良いのでしょうか?
  • TreeViewのノードの編集結果が反映されない問題について、C#3.5を使用している場合に起こる現象です。treeView1にはnameが「ノード1」のノードがセットされていて、ノードを編集したと思ったのですがノードのテキストは変更されませんでした。ノードそのものを入れ替えるにはどのように記述すれば良いのか、解決方法を教えてください。
回答を見る
  • ベストアンサー

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

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

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

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

takagoo100
質問者

お礼

ご返答ありがとうございます。 なるほど、選択してる場所を探して入れ替えるわけですか。 そのやり方できました。ありがとうございます。

関連するQ&A

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

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

  • 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("追加したい名前") で追加できます。 子ノードを追加する時はどうしたらいいのでしょうか。 ご存知の方がいらっしゃいましたら教えて下さい。 よろしくお願いします。

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

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

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

    C++Builderを使用しています。 TreeViewで、ノードのテキストにより、アイコンを 変えたいのですが、方法を教えていただけないでしょうか。 たとえば、ノードの名前がABCだっったら、 Aを読み取り、アイコンを自動設定するような・・・。 よろしくお願いします。

  • 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

  • delphi、treeviewについて再び

    お世話になっております。 たびたびtreeviewがらみなんですが、 treeview上で、nodeのテキストを変更可能にした時、 OnEditedで該当ノードのテキストを取得しようとすると、 やり方が悪いのか、どうしても変更前のテキストしか取得できません。 変更後のテキストを取得するにはどうしたらいいのでしょう?

  • .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(); }

専門家に質問してみよう