C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: TreeViewを動的に操作


(過去ログ 99 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■59207 / inTopicNo.1)  TreeViewを動的に操作
  
□投稿者/ ちか (11回)-(2011/05/19(Thu) 10:14:28)

分類:[C#] 

2011/05/19(Thu) 12:03:08 編集(投稿者)
2011/05/19(Thu) 11:19:55 編集(投稿者)
2011/05/19(Thu) 10:38:00 編集(投稿者)

いつも利用させていただいております。

TreeViewを使用して下記のような事をしたいのですが
どのようにしたらよいかアドバイス頂けないでしょうか?

テーブル
商品コード 商品名  使用商品
111     AAA    222
111 AAA 444
111 AAA 555
222 BBB 333
333 CCC
444 DDD 333
444 DDD 666
555 EEE
666 FFF

この時に下記のようなTreeにしたいと思っています。

111:AAA
|-----------222:BBB
|      |-----------333:CCC
|-----------444:DDD
|      |-----------333:CCC
|      |-----------666:FFF
|-----------555:EEE


treeView1.Nodes.Add(new TreeNode("111"));

treeView1.Select();
TreeNode _ParentNode = treeView1.Nodes[0];

for (int i = 0; i < dt.Rows.Count; i++)
{
if (_ParentNode != null) { _ParentNode.Nodes.Add(new TreeNode(dt.Rows[i][0].ToString())); }
}

treeView1.TopNode.Expand();

ただの子ノードがなければ作れたのですが
こういった場合どのようにしたらよいか教えてください。
引用返信 編集キー/
■59208 / inTopicNo.2)  Re[1]: TreeViewを動的に操作
□投稿者/ shu (696回)-(2011/05/19(Thu) 10:23:09)
No59207 (ちか さん) に返信

いまひとつどうなっているのか分かりませんがDictionary(of String,TreeNode)
を使ってキーとTreeNodeの関連付けをされると良いかもしれません。
引用返信 編集キー/
■59211 / inTopicNo.3)  Re[1]: TreeViewを動的に操作
□投稿者/ よねKEN (710回)-(2011/05/19(Thu) 11:45:00)
2011/05/19(Thu) 11:45:19 編集(投稿者)
No59207 (ちか さん) に返信
> テーブル
> 商品コード 商品名   使用商品
> 111     AAA    222
> 111         AAA       444
> 111         AAA       555
> 222         BBB       333
> 333         CCC
> 444         DDD       333
> 444         DDD       666
> 555         EEE
> 666         FFF

このテーブルの構造を変えることは可能でしょうか?
今のテーブルでは、親がその親に属する子の情報を持っている状態です。
子が複数の親に属することがあるような場合は上記のようなテーブルになるかと思いますが、
子が単一の親にしか属さないのであれば、子の商品の情報として
親の商品コードを持つようにするとシンプルな実装が可能になります。

上記のテーブルの場合、上から順にデータを見ていくとしたら、
(1)1行目の商品コード111を見る
(2)全行の使用商品に111がないか確認する
(3)
   (a)なければ、111は最上位のノードなので、ノードを作ってTreeViewに直接追加
   (b)あれば、111は最上位のノードではないので、使用商品に111を持っている商品コードXのノードの作成を試みる。
      Xに対しても(2)の作業を行う。

   :以下省略

のように全データを行き来しながらツリーを構成していくことになります。

引用返信 編集キー/
■59214 / inTopicNo.4)  Re[2]: TreeViewを動的に操作
□投稿者/ よねKEN (711回)-(2011/05/19(Thu) 12:03:27)
2011/05/19(Thu) 12:06:30 編集(投稿者)
No59208 (shu さん) に返信
> いまひとつどうなっているのか分かりませんがDictionary(of String,TreeNode)
> を使ってキーとTreeNodeの関連付けをされると良いかもしれません。

shuさんの案で実装してみました。
Dictionaryを使うことで、No59211 で書いた「行き来」の代わりができます。
ただし、ツリーに商品名は表示していませんので、商品名も表示しようとするともう一工夫必要になります。

// 前提:新規プロジェクトでを立ち上げ、treeView1とbutton1を配置。Form1_Loadイベント、button1_Clickイベントを準備。
using System;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private DataTable dt;
        private void Form1_Load(object sender, EventArgs e)
        {
            dt = new DataTable("商品テーブル");
            dt.Columns.Add("商品コード", typeof(string));
            dt.Columns.Add("商品名", typeof(string));
            dt.Columns.Add("使用商品", typeof(string));

            dt.Rows.Add("111", "AAA", "222");
            dt.Rows.Add("111", "AAA", "444");
            dt.Rows.Add("111", "AAA", "555");
            dt.Rows.Add("222", "BBB", "333");
            dt.Rows.Add("333", "CCC", "");
            dt.Rows.Add("444", "DDD", "333");
            dt.Rows.Add("444", "DDD", "666");
            dt.Rows.Add("555", "EEE", "");
            dt.Rows.Add("666", "FFF", "");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Dictionary<string, TreeNode> nodes = new Dictionary<string, TreeNode>();
            foreach (DataRow row in dt.Rows)
            {
                string parentKey = row.Field<string>("商品コード"); // (string)row["商品コード"] (.NET Framework3.5未満の場合)
                string childKey = row.Field<string>("使用商品");    // (string)row["使用商品"]   (.NET Framework3.5未満の場合)

                TreeNode parent = null;
                if (nodes.ContainsKey(parentKey))
                {
                    parent = nodes[parentKey];
                }
                else
                {
                    parent = new TreeNode(parentKey);
                    nodes.Add(parentKey, parent);
                }

                if (childKey != "")
                {
                    TreeNode child = null;
                    if (nodes.ContainsKey(childKey))
                    {
                        // 注意:このフローは通らない
                        // ここに来るということは、複数の親が同一の子を持つということ
                        // それを許可する場合は、TreeViewでは表現できない
                        child = nodes[childKey];
                    }
                    else
                    {
                        child = new TreeNode(childKey);
                        nodes.Add(childKey, child);
                        parent.Nodes.Add(child);
                    }
                }
            }

            foreach (TreeNode node in nodes.Values)
            {
                if (node.Parent == null)
                {
                    treeView1.Nodes.Add(node);
                }
            }

            treeView1.TopNode.Expand();
        }
    }
}

引用返信 編集キー/
■59215 / inTopicNo.5)  Re[3]: TreeViewを動的に操作
□投稿者/ よねKEN (712回)-(2011/05/19(Thu) 12:10:14)
No59214 (よねKEN さん) に返信
> // 注意:このフローは通らない
> // ここに来るということは、複数の親が同一の子を持つということ
> // それを許可する場合は、TreeViewでは表現できない
> child = nodes[childKey];

orz
No59211 の投稿から的外れですね。1つの子が複数の親に属しているデータが例に含まれていました。
子の重複が前提のようなので、No59214 のコードをもう少し改良しないといけませんね。
引用返信 編集キー/
■59216 / inTopicNo.6)  Re[1]: TreeViewを動的に操作
□投稿者/ shu (697回)-(2011/05/19(Thu) 13:14:15)
No59207 (ちか さん) に返信

回答ついた後にその部分を編集されてしまうと、回答した内容が変に
なってしまうので編集でなく回答に対し回答を書いたほうがスレの流れが
分かりやすいかと思います。

ルートの商品は使用商品に含まれていない商品でよいのでしょうか?
Select A.*
From テーブル A left join テーブル B on A.商品コード = B.使用商品
Where B.使用商品 is Null


商品の使用商品を取得
Select A.*
From テーブル A Where A.商品コード = <商品コード>

これを繰り返し実行していくことになると思います。TreeNodeを作成しながら上から下に
順番に実行していき使用商品のカウントが0になったら次のNodeへ進むと良いと思います。

一気に取得してDataTableで検索してもよいでしょう。

TreeNodeの派生クラスを使用するかTagに商品コードを格納するとNodeを取得したときに商品コードを
取得することが出来ます。

Root
├Node1
│ ├Node1-1
│ └Node1-2
├Node2
│ ├Node2-1
│ │└Node2-1-1
│ └Node2-2
└Node3

となっていたとすると
(1)RootからNode1,Node2,Node3を取得する
(2)Node1からNode1-1,Node1-2を取得する
(3)Node1-1について使用商品を取得する。ないので次へ
(4)Node1-2についても同様
(5)Node2からNode2-1,Node2-2を取得する
(6)Node2-1からNode2-1-1を取得する
(7)Node2-1-1について使用商品を取得する。ないので次へ
(8)Node2-2について使用商品を取得する。ないので次へ
(8)Node3について使用商品を取得する。ないので次へ

という順番で検索していくとよいと思います。





引用返信 編集キー/
■59221 / inTopicNo.7)  Re[2]: TreeViewを動的に操作
□投稿者/ ちか (12回)-(2011/05/19(Thu) 14:34:55)
回答ありがとうございます。

編集の件、次回から気を付けます。

shuさんに教えていただいた方法でやってみたいと思います。



No59216 (shu さん) に返信
> ■No59207 (ちか さん) に返信
>
> 回答ついた後にその部分を編集されてしまうと、回答した内容が変に
> なってしまうので編集でなく回答に対し回答を書いたほうがスレの流れが
> 分かりやすいかと思います。
>
> ルートの商品は使用商品に含まれていない商品でよいのでしょうか?
> Select A.*
> From テーブル A left join テーブル B on A.商品コード = B.使用商品
> Where B.使用商品 is Null
>
>
> 商品の使用商品を取得
> Select A.*
> From テーブル A Where A.商品コード = <商品コード>
>
> これを繰り返し実行していくことになると思います。TreeNodeを作成しながら上から下に
> 順番に実行していき使用商品のカウントが0になったら次のNodeへ進むと良いと思います。
>
> 一気に取得してDataTableで検索してもよいでしょう。
>
> TreeNodeの派生クラスを使用するかTagに商品コードを格納するとNodeを取得したときに商品コードを
> 取得することが出来ます。
>
> Root
> ├Node1
> │ ├Node1-1
> │ └Node1-2
> ├Node2
> │ ├Node2-1
> │ │└Node2-1-1
> │ └Node2-2
> └Node3
>
> となっていたとすると
> (1)RootからNode1,Node2,Node3を取得する
> (2)Node1からNode1-1,Node1-2を取得する
> (3)Node1-1について使用商品を取得する。ないので次へ
> (4)Node1-2についても同様
> (5)Node2からNode2-1,Node2-2を取得する
> (6)Node2-1からNode2-1-1を取得する
> (7)Node2-1-1について使用商品を取得する。ないので次へ
> (8)Node2-2について使用商品を取得する。ないので次へ
> (8)Node3について使用商品を取得する。ないので次へ
>
> という順番で検索していくとよいと思います。
>
>
>
>
>
引用返信 編集キー/
■59243 / inTopicNo.8)  Re[3]: TreeViewを動的に操作
□投稿者/ よねKEN (715回)-(2011/05/19(Thu) 21:57:46)
C#のバージョンなどの開発環境が明示されていないので、参考になるかわかりませんが、
LINQ(C#3.0 .NET Framework3.5以上で使用可)を使って実装してみました。

LINQを使うのが初めてなので、効率的にかけているかまではわかりませんので、全面的な信頼はなさらないよう。
(たとえばデータ量が多くなった場合にどうなのか?とか、もっとシンプルになるはずとか)

◆コードの前提:
  treeView1とbutton1を配置していて、button1をクリックしたらツリービューが作成されます。
◆実装内容の補足:
  処理をしやすいように、まず以下のようなデータの変換を行ってから、ツリービューを構成しています。

[商品テーブル]
商品   商品   使用
コード 名     商品
"111", "AAA", "222"
"111", "AAA", "444"
"111", "AAA", "555"
"222", "BBB", "333"
"333", "CCC", ""
"444", "DDD", "333"
"444", "DDD", "666"
"555", "EEE", ""
"666", "FFF", ""

         ↓

[子商品テーブル] … 子の商品から見た表
商品   商品   親商品
コード 名     コード
"111", "AAA", ""
"222", "BBB", "111"
"333", "CCC", "222"
"333", "CCC", "444"
"444", "DDD", "111"
"555", "EEE", "111"
"666", "FFF", "444"


'-- コードはここから --
using System;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;
using System.Linq;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private DataTable dt;
        private void Form1_Load(object sender, EventArgs e)
        {
            dt = new DataTable("商品テーブル");
            dt.Columns.Add("商品コード", typeof(string));
            dt.Columns.Add("商品名", typeof(string));
            dt.Columns.Add("使用商品", typeof(string));

            dt.Rows.Add("111", "AAA", "222");
            dt.Rows.Add("111", "AAA", "444");
            dt.Rows.Add("111", "AAA", "555");
            dt.Rows.Add("222", "BBB", "333");
            dt.Rows.Add("333", "CCC", "");
            dt.Rows.Add("444", "DDD", "333");
            dt.Rows.Add("444", "DDD", "666");
            dt.Rows.Add("555", "EEE", "");
            dt.Rows.Add("666", "FFF", "");
        }

        private class 商品
        {
            public string 商品コード { get; private set; }
            public string 商品名 { get; private set;}
            public string 使用商品 { get; private set;}

            public 商品(string 商品コード, string 商品名, string 使用商品)
            {
                this.商品コード = 商品コード;
                this.商品名 = 商品名;
                this.使用商品 = 使用商品;
            }

            public override bool Equals(object obj)
            {
                商品 s = obj as 商品;
                if (s == null) return false;
                return this.商品コード.Equals(s.商品コード);
            }

            public override int GetHashCode()
            {
                return this.商品コード.GetHashCode();
            }

            public override string ToString()
            {
                return string.Format("{0},{1},{2}", this.商品コード, this.商品名, this.使用商品);
            }
        }

        private class 子商品
        {
            public string 商品コード { get; private set; }
            public string 商品名 { get; private set; }
            public string 親商品コード { get; private set; }

            public 子商品(string 商品コード, string 商品名, string 親商品コード)
            {
                this.商品コード = 商品コード;
                this.商品名 = 商品名;
                this.親商品コード = 親商品コード;
            }

            public override bool Equals(object obj)
            {
                子商品 s = obj as 子商品;
                if (s == null) return false;
                return this.商品コード.Equals(s.商品コード) && this.親商品コード.Equals(s.親商品コード);
            }

            public override int GetHashCode()
            {
                return this.商品コード.GetHashCode() * 10 + this.親商品コード.GetHashCode();
            }

            public override string ToString()
            {
                return string.Format("{0},{1},{2}", this.商品コード, this.商品名, this.親商品コード);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var 商品テーブル =
                from DataRow row in dt.Rows
                select new 商品(row.Field<string>("商品コード"), row.Field<string>("商品名"), row.Field<string>("使用商品"));

            // 商品テーブルを子の商品からまとめなおしたテーブル。子からその親の商品コードを引くことができる。
            var 子商品テーブル =
                (from 親商品 in 商品テーブル
                 join 子商品 in 商品テーブル on 親商品.商品コード equals 子商品.使用商品 into 商品s
                 from 商品 in 商品s.DefaultIfEmpty()
                 select new 子商品(親商品.商品コード, 親商品.商品名, (商品 == null ? "" : 商品.商品コード))).Distinct();

            int count = 子商品テーブル.Count(); // 最終的なノードの数になる

            // 一回の「foreach (子商品 商品 in 処理対象商品)」で処理済みとなった親商品コードの一覧
            // クエリ:処理対象商品の抽出に利用
            List<string> processed = new List<string>() { "" };

            // 一回の「foreach (子商品 商品 in 処理対象商品)」の処理中の親商品コードの一覧
            List<string> processing = new List<string>();

            // TreeNode.NodesもTreeView.Nodesも一律扱えるように
            // 商品コードとその子を管理するTreeNodeCollectionのペアを保管しておく
            Dictionary<string, TreeNodeCollection> allNodes = new Dictionary<string, TreeNodeCollection>();
            allNodes.Add("", treeView1.Nodes);

            while (allNodes.Count < count)
            {
                // 前回処理した商品コードを親に持つ子の商品のみを処理対象とする
                // ツリーの上位階層の商品コードから順に処理していくため
                var 処理対象商品 =
                    from 商品 in 子商品テーブル
                    join 処理済商品コード in processed on 商品.親商品コード equals 処理済商品コード
                    select 商品;

                processing.Clear();
                foreach (子商品 商品 in 処理対象商品)
                {
                    TreeNode node = new TreeNode(商品.商品コード + ":" + 商品.商品名);
                    allNodes[商品.親商品コード].Add(node);

                    if (!allNodes.ContainsKey(商品.商品コード))
                    {
                        allNodes.Add(商品.商品コード, node.Nodes);
                    }
                    processing.Add(商品.商品コード);
                }
                processed = new List<string>(processing);
            }

            treeView1.TopNode.Expand();

        }

    }
}

引用返信 編集キー/
■59245 / inTopicNo.9)  Re[1]: TreeViewを動的に操作
□投稿者/ よねKEN (716回)-(2011/05/19(Thu) 22:14:48)
1つ仕様面で気になる点がありますので、念のため先ほどの投稿への補足をしておきます。

■No59207 (ちか さん) に返信
> 111:AAA
> |-----------222:BBB
> |      |-----------333:CCC
> |-----------444:DDD
> |      |-----------333:CCC
> |      |-----------666:FFF
> |-----------555:EEE
> 

 111:AAA
 |-----------222:BBB
 |      |-----------333:CCC
 |                          |-----------777:GGG
 |-----------444:DDD
 |      |-----------333:CCC
 |                          |-----------777:GGG
 |      |-----------666:FFF
 |-----------555:EEE


というようなツリーになる場合はテーブルのデータは

> テーブル
> 商品コード 商品名   使用商品
> 111     AAA    222
> 111         AAA       444
> 111         AAA       555
> 222         BBB       333
> 333         CCC
> 444         DDD       333
> 444         DDD       666
> 555         EEE
> 666         FFF
> 

 テーブル
 商品コード 商品名   使用商品
 111     AAA    222
 111         AAA       444
 111         AAA       555
 222         BBB       333
 333         CCC       777   ←使用商品を空欄から777に変更
 444         DDD       333
 444         DDD       666
 555         EEE
 666         FFF
 777         GGG             ←追加(1つ目分)
 777         GGG             ←追加(2つ目分)

となるのでしょうか?

こういうパターンには No59243 の投稿のソースコードは対応できていません。
#これを考慮するにはまた一工夫必要そうです。

引用返信 編集キー/
■59246 / inTopicNo.10)  Re[2]: TreeViewを動的に操作
□投稿者/ shu (702回)-(2011/05/19(Thu) 22:33:50)
No59245 (よねKEN さん) に返信

> 777 GGG ←追加(1つ目分)
> 777 GGG ←追加(2つ目分)
>
> となるのでしょうか?
予想ですがそうはならないと思います。
商品を構成する商品(部品)がいろいろな商品に対し同じ部品を
使うということになると思うので部品をさらに構成する部品の情報を
その親の商品または部品毎に持つ必要はないと思うし持てない気がします。




引用返信 編集キー/
■59248 / inTopicNo.11)  Re[3]: TreeViewを動的に操作
□投稿者/ shu (703回)-(2011/05/19(Thu) 23:17:34)
再帰を使った方法です。ループしていると危険です。データ量が多いと使えません。
TreeNodeのテキストは商品名のみの状態です。

            dt = new DataTable("商品テーブル");
            dt.Columns.Add("商品コード", typeof(string));
            dt.Columns.Add("商品名", typeof(string));
            dt.Columns.Add("使用商品", typeof(string));

            dt.Rows.Add("111", "AAA", "222");
            dt.Rows.Add("111", "AAA", "444");
            dt.Rows.Add("111", "AAA", "555");
            dt.Rows.Add("222", "BBB", "333");
            dt.Rows.Add("333", "CCC", "");
            dt.Rows.Add("444", "DDD", "333");
            dt.Rows.Add("444", "DDD", "666");
            dt.Rows.Add("555", "EEE", "");
            dt.Rows.Add("666", "FFF", "");

            MakeTree(null, "111");



        private void MakeTree(TreeNode nd ,string Code)
        {
            DataRow[] rows = dt.Select(String.Format("商品コード = '{0}'", Code), "商品コード");

            if (rows.Length>0)
            {
                TreeNode nd2;
                string gnm = rows[0].Field<string>("商品名");
                if (nd == null)
                {
                    nd2 = treeView1.Nodes.Add(gnm);
                } else {
                    nd2 = nd.Nodes.Add(gnm);
                }

                foreach(DataRow row in rows)
                {
                    string ucd = row.Field<string>("使用商品");

                    if (ucd != "")
                    {
                        MakeTree(nd2, ucd);
                    }
                }
            }
        }

引用返信 編集キー/
■59303 / inTopicNo.12)  Re[4]: TreeViewを動的に操作
□投稿者/ shu (709回)-(2011/05/20(Fri) 23:01:01)
No59248 (shu さん) に返信

Queueを使用して再帰をなくしてみました。データがループになっている場合無限ループになります。


    dt = new DataTable("商品テーブル");
    dt.Columns.Add("商品コード", typeof(string));
    dt.Columns.Add("商品名", typeof(string));
    dt.Columns.Add("使用商品", typeof(string));

    dt.Rows.Add("111", "AAA", "222");
    dt.Rows.Add("111", "AAA", "444");
    dt.Rows.Add("111", "AAA", "555");
    dt.Rows.Add("222", "BBB", "333");
    dt.Rows.Add("333", "CCC", "");
    dt.Rows.Add("444", "DDD", "333");
    dt.Rows.Add("444", "DDD", "666");
    dt.Rows.Add("555", "EEE", "");
    dt.Rows.Add("666", "FFF", "");

    MakeTree("111");
 

    private void MakeTree( string Code)
    {
        Queue<TreeNode> lst処理 = new Queue<TreeNode>();

        TreeNode root = treeView1.Nodes.Add("");
        root.Tag = Code;
        lst処理.Enqueue(root);

        while (lst処理.Count > 0)
        {
            TreeNode nd = lst処理.Dequeue();
            DataRow[] rows = dt.Select(String.Format("商品コード = '{0}'", (string)nd.Tag), "使用商品");
            foreach (DataRow row in rows)
            {
                if (nd.Text.Length==0) 
                {
                    nd.Text = row.Field<string>("商品名");
                }
                string ucd = row.Field<string>("使用商品");
                if (ucd.Length > 0) 
                {
                    TreeNode nd2 = nd.Nodes.Add("");
                    nd2.Tag = ucd;
                    lst処理.Enqueue(nd2);
                }
            }
        }
    }

引用返信 編集キー/
■59368 / inTopicNo.13)  Re[5]: TreeViewを動的に操作
□投稿者/ ちか (13回)-(2011/05/23(Mon) 19:02:42)
よねKENさん、shuさん色々とありがとうございます。
別作業で急ぎが入りまだ確認出来ていない状態です。

 
引用返信 編集キー/
■59407 / inTopicNo.14)  Re[6]: TreeViewを動的に操作
□投稿者/ ちか (14回)-(2011/05/25(Wed) 09:54:06)
うまくデータの取得ができず、SQLにてSELECT取得する際に、階層にて取得(TreeView表示順)をしてから
表示しようと教えていただいた物を使ってやっていますが、一番親にまで戻ると次の表示が階層の作りが
おかしくなってしまっています。

商品CD   名前  使用商品CD 名前  階層レベル
100005   AAA   590636   BBB   1
590636   BBB   301782   CCC   2
590636   BBB   300221   DDD   2
590636   BBB   300255   EEE   2
590636   BBB   300092   FFF   2
100005   AAA   590666   GGG   1
590666   GGG   500173   HHH   2
500173   HHH   300262   III   3
500173   HHH   390001   JJJ   3
500173   HHH   302019   KKK   3
500173   HHH   300469   LLL   3
500173   HHH   300467   MMM   3
500173   HHH   300260   NNN   3
500173   HHH   400313   OOO   3
590666   GGG   590636   BBB   2
590636   BBB   301782   CCC   3
590636   BBB   300221   DDD   3
590636   BBB   300255   EEE   3
590636   BBB   300092   FFF   3
590666   GGG   590638   PPP   2
590638   PPP   590637   QQQ   3
590637   QQQ   390001   JJJ   4
590637   QQQ   300221   DDD   4
590638   PPP   300255   EEE   3
100005   AAA   301146   RRR   1
100005   AAA   400106   SSS   1
100005   AAA   402375   TTT   1


dt = this.ObjOracle.GetDataTable(sSql.ToString());

treeView1.Nodes.Clear();

treeView1.Select();
TreeNode _ParentNode = new TreeNode();

for (int i = 0; i < dt.Rows.Count; i++)
{
if (_ParentNode.Text != dt.Rows[i][0].ToString() + "_" + dt.Rows[i][1].ToString())
{
if (_ParentNode.Text == string.Empty)
{
treeView1.Nodes.Add(dt.Rows[i][0].ToString() + "_" + dt.Rows[i][1].ToString());
_ParentNode = treeView1.Nodes[0];
}
else
{
string str = _ParentNode.FullPath;
if (str.Contains(dt.Rows[i][0].ToString() + "_" + dt.Rows[i][1].ToString()))
{
_ParentNode = _ParentNode.Parent;
}
else
{
_ParentNode = _ParentNode.Nodes.Add(dt.Rows[i][0].ToString() + "_" + dt.Rows[i][1].ToString());
}
_ParentNode.Nodes.Add(new TreeNode(dt.Rows[i][2].ToString() + "_" + dt.Rows[i][3].ToString()));
}
}
else
{
_ParentNode.Nodes.Add(new TreeNode(dt.Rows[i][2].ToString() + "_" + dt.Rows[i][3].ToString()));
}
}
引用返信 編集キー/
■59426 / inTopicNo.15)  Re[7]: TreeViewを動的に操作
□投稿者/ ちか (15回)-(2011/05/25(Wed) 15:53:33)
解決はしていませんがあとは自力でしてみます。
いろいろありがとうございました。
解決済み
引用返信 編集キー/
■59437 / inTopicNo.16)  Re[8]: TreeViewを動的に操作
□投稿者/ shu (725回)-(2011/05/25(Wed) 17:55:37)
No59426 (ちか さん) に返信

> _ParentNode = _ParentNode.Parent
は一致するまであがらないと駄目じゃないかな?
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -