- 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 の入門サイト
じゃんぬねっと日誌
|