- PR -

TreeViewのフルパス取得について

投稿者投稿内容
Asoas
ベテラン
会議室デビュー日: 2006/03/10
投稿数: 60
投稿日時: 2006-03-13 23:29
ツリービューで悩んでいます。誰か分かる方教えてください。
(ex)のような「構造」のTreeViewがある場合、「取りたい情報」
のような配列変数にツリービュー内の全てのフルパスを取得した
いと考えています。
現状nodes[i].fullpathで回して取得しようと考えてたのですが、
ルートノードしかパスが取れません。。。

誰か分かる方教えてください。
よろしくお願いします。
言語はC#です。

(ex)
********下記のような構造*******
ああああ----いいい
    ----ううう----えええ
        ----おおおお
かかかか----ききき

********取りたい情報***********
Path[1]=ああああ\いいい
Path[2]=ああああ\ううう\えええ
Path[3]=ああああ\ううう\おおお
Path[4]=かかかか\ききき


Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-03-13 23:42
子ノードを再帰呼び出しするようにして、子ノードを持っていない場合にコレクションに追加していけば良いんじゃないですか?
コード:
メソッドイメージ
void ノード探索(コレクション, ノード) {
    if (ノードが子ノードを持っている) {
        foreach (子ノード in ノード.Nodes)
            ノード探索(コレクション, 子ノード);
    }
    else {
        コレクション.Add(ノードのパス)
    }
}

Asoas
ベテラン
会議室デビュー日: 2006/03/10
投稿数: 60
投稿日時: 2006-03-14 14:34
Hongliang様 回答ありがとうございました。
ロジックは分かりました。
ただ、C#初心者なもので具体的にコーディングするとどのようなものになるのでしょうか?私が途中までコーディングしたもの(ex)。
コレクションとオブジェクトの関係がいまいち掴めていません。
よろしくお願いいたします。

(ex)
//path取得
private void node_search(TreeNodeCollection tree_col,TreeNode node)
{
if(node.GetNodeCount == 0)
{
foreach(node.FirstNode childnode in node.Nodes)
{
node_search(tree_col,childnode);
}
}
else
{
tree_col.Add(node.FullPath);
}
}
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-14 15:19
引用:

ビギナーさんの書き込み (2006-03-14 14:34) より:

ロジックは分かりました。


私が思ったのと、使用する "型" 自体が違うみたいです。

引用:

private void node_search(TreeNodeCollection tree_col,TreeNode node)


私のイメージでは、第 1 引数は System.Collections.Specialized.StringCollection です。
TreeNodeCollection 内のパスを取得しようとしているので、
2 つ (全部) の引数が TreeNode に関することというのはありえないですよね。

引用:

foreach(node.FirstNode childnode in node.Nodes)


node.FirstNode ってなんでしょうか?
ここは単純に、TreeNode の型を使うんじゃないでしょうか?

引用:

node_search(tree_col,childnode);


再帰の結果は tree_col 自体に保持するつもりなんですか?
そもそも、型がおかしいので String という名のパスは保持できませんが。[↓参照]

引用:

tree_col.Add(node.FullPath);


これは元の鞘に... というより、何を格納するかわかっていますか?
引数は string ですが、実際に格納 されちゃう のは TreeNode ですよ。
結局元の構造に戻っているだけで、パスを取得する機構になっていません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
YAS
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 59
投稿日時: 2006-03-14 15:21
ビギナーさん,こんにちは。

VBではこんな感じでしょうか。
参考にしてください。
コード:
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Tree1 As New TreeNode("ああああ")
        Tree1.Nodes.Add("いいい")
        Tree1.Nodes.Add("ううう").Nodes.Add("えええ")
        Tree1.Nodes.Add("おおお")
        Dim Tree2 As New TreeNode("かかかか")
        Tree2.Nodes.Add("ききき")
        Me.TreeView1.Nodes.Add(Tree1)
        Me.TreeView1.Nodes.Add(Tree2)
        Me.TreeView1.ExpandAll()
        EnumNode(Me.TreeView1.Nodes)
    End Sub

    Private Sub EnumNode(ByVal Nodes As TreeNodeCollection)
        For Each Node As TreeNode In Nodes
            Debug.Print(Node.FullPath)
            If Node.Nodes.Count > 0 Then EnumNode(Node.Nodes)
        Next
    End Sub

End Class


実行結果
ああああ
ああああ\いいい
ああああ\ううう
ああああ\ううう\えええ
ああああ\おおお
かかかか
かかかか\ききき
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-14 15:38
引用:

YASさんの書き込み (2006-03-14 15:21) より:

VBではこんな感じでしょうか。
参考にしてください。


これだと、子ノードを持っているノードまで出力されますよね。
質問者さんの仕様を見る限り、ちょっと結果が異なると思います。

また、コレクションまたは配列に加えずに直接出力されています。
質問者さんの投稿内容を見ると、配列 (またはコレクション) で取得して、
"それから" その取得したものに何かをしたいように思えます。

# 十二分に参考になるコードですけどね。(^^)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
YAS
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 59
投稿日時: 2006-03-14 16:15
引用:

これだと、子ノードを持っているノードまで出力されますよね。
質問者さんの仕様を見る限り、ちょっと結果が異なると思います。

また、コレクションまたは配列に加えずに直接出力されています。
質問者さんの投稿内容を見ると、配列 (またはコレクション) で取得して、
"それから" その取得したものに何かをしたいように思えます。


すみません。まさに,「こんな感じ?」程度の認識で,書いてしまいました。

では,改めて...

VBではこんな感じでしょうか。
参考にしてください。
コード:

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim Tree1 As New TreeNode("ああああ")
Tree1.Nodes.Add("いいい")
Tree1.Nodes.Add("ううう").Nodes.Add("えええ")
Tree1.Nodes.Add("おおお")
Dim Tree2 As New TreeNode("かかかか")
Tree2.Nodes.Add("ききき")
Me.TreeView1.Nodes.Add(Tree1)
Me.TreeView1.Nodes.Add(Tree2)
Me.TreeView1.ExpandAll()
EnumNode(Me.TreeView1.Nodes)
End Sub

Dim NodeList As New Specialized.StringCollection

Private Sub EnumNode(ByVal Nodes As TreeNodeCollection)
For Each Node As TreeNode In Nodes
If Node.Nodes.Count > 0 Then
EnumNode(Node.Nodes)
Else
NodeList.Add(Node.FullPath)
End If
Next
End Sub

End Class




[ メッセージ編集済み 編集者: YAS 編集日時 2006-03-14 16:16 ]

[ メッセージ編集済み 編集者: YAS 編集日時 2006-03-14 16:17 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-14 17:11
引用:

YASさんの書き込み (2006-03-14 16:15) より:

では,改めて...
VBではこんな感じでしょうか。


プライベート メンバになってしまうのがつらいところですね。
まあ、サンプルはあくまでサンプルなので全然問題ないですけどね。
「独立性」を高めると以下のようになると思います。

コード:

    /* TreeNodeHelper クラス */
    using System.Windows.Forms;
    using System.Collections.Specialized;

    public sealed class TreeNodeHelper {

      #region GetInnerNodesPathCollection メソッド 

        public static StringCollection GetInnerNodesPathCollection(TreeNodeCollection oTreeNodeCollection) {
            if (oTreeNodeCollection.Count <= 0) {
                return null;
            }

            StringCollection oStringCollection = new StringCollection();

            foreach (TreeNode oTreeNode in oTreeNodeCollection) {
                oStringCollection = EnumNodesPath(oStringCollection, oTreeNode);
            }

            return oStringCollection;
        }

      #endregion

      #region EnumNodesPath メソッド 

        private static StringCollection EnumNodesPath(StringCollection oStringCollection, TreeNode oTreeNode) {
            if (oTreeNode.Nodes.Count >= 1) {
                foreach (TreeNode one in oTreeNode.Nodes) {
                    EnumNodesPath(oStringCollection, one);
                }
            } else {
                oStringCollection.Add(oTreeNode.FullPath);
            }

            return oStringCollection;
        }

      #endregion

    }


以下は利用例です。
このように、ローカル変数にも気軽に使えると思います。(呼び出し先の都合など知らなくて良い)

コード:

    private void button1_Click(object sender, System.EventArgs e) {
        StringCollection sc = TreeNodeHelper.GetInnerNodesPathCollection(this.treeView1.Nodes);

        // 出力して中身を確認
        foreach (string st in sc) {
            Console.WriteLine(st);
        }
    }


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)