- PR -

TreeViewの中に配置したチェックボックスの中で選択されているものを取得したい。(コーディング見直し)

投稿者投稿内容
KM
会議室デビュー日: 2007/02/14
投稿数: 15
投稿日時: 2007-03-08 15:47
環境 ASP.NET[C#] Webサイト作成

1.新規にWebフォームを作成して、その中にTreeViewとボタンを作成します。
2.TreeViewはチェックボックスを持つように設定。
3.ボタン押下時にTreeViewの中でチェックボックスを選択されているものを取得して、ラベルに表示。

今、実現はできているのですが、コーディングでもっとシンプルにならないものかと、
調査をしているのですが、平行して皆様のお力を借りれたらと思います。

ご指導お願い致します。

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

未記入
大ベテラン
会議室デビュー日: 2006/12/15
投稿数: 157
投稿日時: 2007-03-08 16:21
こんなん出来ました。
コード:
        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = SelectNode(treeView1.Nodes);
        }
        private string SelectNode(TreeNodeCollection nodes)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            if (nodes.Count > 0)
            {
                foreach (TreeNode node in nodes)
                {
                    if (node.Checked)
                    {
                        sb.Append(node.Text);
                    }
                    sb.Append(SelectNode(node.Nodes));
                }
            }
            return sb.ToString();
        }

KM
会議室デビュー日: 2007/02/14
投稿数: 15
投稿日時: 2007-03-08 16:39
ありがとうございます。

なんか、すっきりとしましたし、
さらにこの場合、階層を指定してないので、
ツリーの中身全部を出力できますね。

PS.最初は回帰的なコードに???となっていましたwww

ご指導ありがとうございました。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-03-08 17:48
引用:

KMさんの書き込み (2007-03-08 16:39) より:
PS.最初は回帰的なコードに???となっていましたwww


再帰だよね。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-03-08 19:16
取り出す順番に意味がないなら、キューやスタックを使って、再帰しない方法もあります。
ツリーの深さに依りますが、関数呼び出しのスタックは、ヒープに比べて少ないし、コストも大きく変わるので、両方の方法を知っておくとよいでしょう。


二?三日後にブログのネタになる予定。書けたらいいな...
_________________
KM
会議室デビュー日: 2007/02/14
投稿数: 15
投稿日時: 2007-03-09 09:46
>>Jitta様

キューやスタックがなんだかわからないのでちょっと勉強してきます。
未記入
大ベテラン
会議室デビュー日: 2006/12/15
投稿数: 157
投稿日時: 2007-03-09 10:20
私も楽しみにしてます>Jittaさん
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-03-09 21:30
急かされた?
エントリしました<wankuma.com>

ただ、私は再帰呼び出し(関数の呼び出し)にコストがかかると思いこんでいたのですが、実験結果は再帰呼び出しの方が早かったです。これは、意外というか、認識を改めないといけないのか。あるいは、テストケースが悪かったのか。
_________________

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