- PR -

TreeView Web Controlsについて

1
投稿者投稿内容
ALADDIN
ベテラン
会議室デビュー日: 2002/08/20
投稿数: 85
お住まい・勤務地: 渋谷
投稿日時: 2002-09-11 18:51
こんにちわALADDINです。

Web ControlsのTreeViewコントロールについてなのですが、
現在foreachによって親ノードに対し子ノードを追加していますが、
階層が深くなればなるほどforeachの方の階層も深くなっていきます。
何かうまい方法はないでしょうか?
階層が深くなってもforeachの階層自体はせいぜい2,3ぐらいまでにしたいのですが


[ メッセージ編集済み 編集者: ALADDIN 編集日時 2002-09-12 10:36 ]
DaikiRyuto
大ベテラン
会議室デビュー日: 2002/07/23
投稿数: 200
投稿日時: 2002-09-11 19:20
引用:

ALADDINさんの書き込み (2002-09-11 18:51) より:

Web ControlsのTreeViewコントロールについてなのですが、
現在foreachによって親ノードに対し子ノードを追加していますが、
階層が深くなればなるほどforeachの方の階層も深くなっていきます。
何かうまい方法はないでしょうか?
階層が深くなってもforeachの階層自体はせいぜい2,3ぐらいまでにしたいのですが




こんにちは。
いまいち話が見えないのですが、親ノード分ループしてそれぞれ子ノードを追加し、次はそれぞれの子ノード分ループして、孫ノードを追加して、というようなことをなさっているのでしょうか?
具体的に今はどのようなコードで実現なさっているのでしょう。
ALADDIN
ベテラン
会議室デビュー日: 2002/08/20
投稿数: 85
お住まい・勤務地: 渋谷
投稿日時: 2002-09-12 09:54
ALADDINです。
DaikiRyutoさんレスありがとうございます。

判りにくい内容ですいません。
現在のソースはこんな感じです。
MSDNのサンプルが元なのですが、現在はこれでツリー階層が2段階です

foreach (DataRow rowB in ds.Tables["B"].Rows)
{
nodeB = new TreeNode();
nodeB.Text = rowB["aaa"] + ", "
+ rowB["bbb"];
tree1.Nodes.Add(nodeB);
foreach (DataRow rowC in rowB.GetChildRows("D"))
{
nodeC = new TreeNode();
nodeC.Text = rowC["xxx"].ToString();
nodeB.Nodes.Add(nodeC);
}
}
ALADDIN
ベテラン
会議室デビュー日: 2002/08/20
投稿数: 85
お住まい・勤務地: 渋谷
投稿日時: 2002-09-12 09:55
あうう、インデントが・・・
見にくくてすいませんTT
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2002-09-12 10:29
引用:

ALADDINさんの書き込み (2002-09-12 09:54) より:
現在のソースはこんな感じです。
MSDNのサンプルが元なのですが、現在はこれでツリー階層が2段階です
コード:
foreach (DataRow rowB in ds.Tables["B"].Rows)
{
    nodeB = new TreeNode();
    nodeB.Text = rowB["aaa"] + ", "
		+ rowB["bbb"];
    tree1.Nodes.Add(nodeB);
    foreach (DataRow rowC in rowB.GetChildRows("D"))
    {
        nodeC = new TreeNode();
        nodeC.Text = rowC["xxx"].ToString();
        nodeB.Nodes.Add(nodeC);
    }
}





 一般的に、最上位のノードのみ保持して、子ノードは再帰呼び出しで処理します。これは、C言語のバイブル、KR本でいうところの、dirwalkのところをまねすればいいでしょう。

 整形ずみ文書は、角括弧で(code)PG(/code)とすれば、上記のようになります。詳しくは、投稿時の下の「オプション」で、「BBコード」をクリックしてください。
DaikiRyuto
大ベテラン
会議室デビュー日: 2002/07/23
投稿数: 200
投稿日時: 2002-09-12 10:47
ネストを深くしないだけが望みなら再帰でいけるかも?
ただ、可読性の点でどうかはわかりません。

以下、適当に書いてみました。
(コンパイルしてません。すいません。)
列名が違うとか、リンクをするとかするならば、もっと色々考えないといけないですが。

protected Microsoft.Web.UI.WebControls.TreeView tree1;

private void Page_Load(object sender, System.EventArgs e) {

// ここでDBからデータ取得したり色々やる
// ..........

foreach (DataRow row in ds.Tables["HOGE_TABLE"].Rows) {
node= new TreeNode();
node.Text = row["HOGE"].ToString();
tree1.Nodes.Add(node);
TestMethod(node, row.GetChildRows("HOGE_A"), 0);
}
}

private int depth = 10; // 深さを示す適当な値

private void TestMethod(TreeNode, node, DataRow dataRow, int currentDepth) {
TreeNode newNode = new TreeNode();
newNode.Text = dataRow["HOGE"].ToString();
node.Nodes.Add(newNode);
currentDepth++;
if (currentDepth < depth) {
TestMethod(newNode, rowB.GetChildRows("HOGE_A"), cnrrentDepth);
}
}


外していたらごめんなさい。
ALADDIN
ベテラン
会議室デビュー日: 2002/08/20
投稿数: 85
お住まい・勤務地: 渋谷
投稿日時: 2002-09-12 12:58
ALADDINです

Jittaさん、DaikiRyutoさんレスありがとうございます
両方試してみて簡単そうな方を選んでみます。^^;

1

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