none
treeviewコントロールへのデータの取込 RRS feed

  • 質問

  • ASP.NET2.0で作成したWEBアプリケーションで使用するWeb.sitemapを、VB2005EXPのtreeviewコントロールを使用してメンテナンスしようと考えています。

    treeviewコントロールのノード名等から、Web.sitemap内のテキストデータを作成することは出来たのですが、Web.sitemapのテキストデータを利用してtreeviewのノードを作成するにはどのように記述すればよいでしょうか。

    ASP.NETではWEb.sitemapをTreeViewに簡単にバインドさせれるのですが、Windowsアプリケーションのtreeviewにも同様に表示させてノードの編集をさせたいと考えています。

    よろしくご教授ください。

    <以下はtreeviewのノードをWeb.sitemap内のテキストデータ用にtextboxに書出すためのコードです>

      Private Sub btn_取得_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_取得.Click
            Me.txt_1.AppendText("<?xml version=""1.0"" encoding=""utf-8"" ?>" & vbCrLf)
            Me.txt_1.AppendText("<siteMap xmlns=""
    http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"" >" & vbCrLf)
            Me.txt_1.AppendText("<siteMapNode title=""FAQ"" url="""">" & vbCrLf)

            For Each Item As TreeNode In Me.tv_1.Nodes.Item(0).Nodes

                Me.txt_1.AppendText("<siteMapNode title=""" & Item.Name & """url=""" & Item.Name & """>" & vbCrLf)

                For Each sitem As TreeNode In Item.Nodes
                    Me.txt_1.AppendText("  <siteMapNode title=""" & sitem.Name & """url=""" & sitem.Name & """>" & vbCrLf)
                    For Each ssitem As TreeNode In sitem.Nodes
                        Me.txt_1.AppendText("    <siteMapNode title=""" & ssitem.Name & """url=""" & ssitem.Name & """/>" & vbCrLf)
                    Next
                    Me.txt_1.AppendText("  </siteMapNode>" & vbCrLf)
                Next
                Me.txt_1.AppendText("</siteMapNode>" & vbCrLf)
            Next

            Me.txt_1.AppendText("</siteMapNode>" & vbCrLf & "</siteMap>")

        End Sub

    2006年11月16日 18:22

回答

すべての返信

  •  M-DASH さんからの引用

    treeviewコントロールのノード名等から、Web.sitemap内のテキストデータを作成することは出来たのですが、Web.sitemapのテキストデータを利用してtreeviewのノードを作成するにはどのように記述すればよいでしょうか。

    試したわけではないのですが、テキストデータ生成できたのであれば、それを解析してノードを追加していくことは可能だと思います。
    TreeNodeCollectionのAdd辺りを使えばいいんじゃないでしょうか?

    TreeNodeCollection メンバ
    http://msdn2.microsoft.com/ja-jp/library/system.web.ui.webcontrols.treenodecollection_members(VS.80).aspx

    2006年11月17日 4:53
    モデレータ
  • TO:trapemiya様

    返信ありがとうございます。

    treeviewコントロールからテキストデータを生成する際は「item.nodesコレクション」を利用して順番にnode名を取得したのですが、Web.sitemapのテキストは以下のようになっており、これをどうnodeに追加(Add)していくと元のtreeviewが復元できるかが解析できずにいます。

    たとえば、 3~5行を読み込んだとして、例Aなのか例Bなのかをテキストからどう読み取ればよいのか悩んでしまいます。

    例A  ルート[FAQ]-1階層目[ハードウェア]-2階層目[パソコン]

    例B  ルート[FAQ]-1階層目[ハードウェア]

                -1階層目[パソコン]


    <Web.sitemapの内容>

    <?xml version="1.0" encoding="utf-8" ?>
    <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
      <siteMapNode title="FAQ" url="">
        <siteMapNode title="ハードウェア" url="ハードウェア">
          <siteMapNode title="パソコン" url="パソコン">
          </siteMapNode>
          <siteMapNode title="プリンタ" url="プリンタ">
            <siteMapNode title="ポートの設定" url="ポートの設定"/>
          </siteMapNode>
        </siteMapNode>
        <siteMapNode title="ソフトウェア" url="ソフトウェア">
          <siteMapNode title="Office" url="Office">
          </siteMapNode>
          <siteMapNode title="Notes" url="Notes">
            <siteMapNode title="メールの圧縮" url="メールの圧縮"/>
          </siteMapNode>
        </siteMapNode>
      </siteMapNode>
     </siteMap>


    それで昨日少し考えた結果、Web.sitemapから取り込むのではなく、Web.sitemapの生成とは別に、後で取り込みやすい方法で書き出そうと思っています。

     みなさまは、Winアプリケーションを実行中に、ユーザーがWindows.forms.treeview.nodesコレクション(Web.Ui.controlsではなく)に加えた変更を、アプリケーションを再起動後も保持するという機能を実装する場合、どのようにnodes.コレクションを保存されていますか?もしよろしければご教授ください。私も早速調べることにします。

     

    2006年11月17日 14:19
  • treeviewに直接バインドはできないので、以下のように手動でやるしかないと思います。

    Visual Basic .NET での XML データでの TreeView コントロールにデータを読み込む方法
    http://support.microsoft.com/default.aspx?scid=kb;ja-jp;308063

    2006年11月18日 5:12
    モデレータ
  • TreeViewの編集 → 編集結果の保存 → TreeViewの再生成 を目的に思考をめぐらせた結果ひとまず次のような方法に至りました。


    【手順1】treeviewを編集し、その結果をdataset.datatableにつぎのような形式で保存。

    カラム1=nodeの階層 , カラム2=nodeの各階層ごとのindex , カラム3=ノード名

    例( 3 , 002 , "パソコン")※treeview.nodes(0).nodes(0).nodes(2)が”パソコン”

    <コード例>※ルートノード(0階層目)を固定しています。

         'TREEVIEWの4階層目までの(階層,階層ごとのindex,ノードの名前)を(T_treedata)へ取得
            With Me.DS_treedata.T_treedata
                .AddT_treedataRow(Me.tv_1.Nodes.Item(0).Level, "0", Me.tv_1.Nodes.Item(0).Name)

                For Each Item As TreeNode In Me.tv_1.Nodes.Item(0).Nodes

                    .AddT_treedataRow(Item.Level, Item.Index, Item.Name)

                    For Each sitem As TreeNode In Item.Nodes

                        .AddT_treedataRow(sitem.Level, Item.Index & sitem.Index, sitem.Name)

                        For Each ssitem As TreeNode In sitem.Nodes

                            .AddT_treedataRow(ssitem.Level, Item.Index & sitem.Index & _
                            ssitem.Index, ssitem.Name)

                        Next
                    Next
                Next
            End With
            Me.T_treedataTableAdapter.Update(Me.DS_treedata.T_treedata)


    【手順2】T_treedataテーブルを(カラム1=nodeの階層 , カラム2=nodeの各階層ごとのindex)の順序でソート


    【手順3】      '階層順の住所順でソートしたT_treedataのレコードをtreeViewに取り込む
            Dim int_2, int_3 As Integer
            With Me.DS_treedata.T_treedata
                For int_1 As Integer = 0 To .Count - 1
                    Select Case .Item(int_1).c_階層

                        Case 0 '0階層の場合
                            Me.TV_2.Nodes.Add(.Item(int_1).c_名前)

                        Case 1 '1階層の場合
                            Me.TV_2.Nodes(0).Nodes.Add(.Item(int_1).c_名前)

                        Case 2 '2階層の場合
                            int_2 = Mid(.Item(int_1).c_住所, 1, 1)
                            Me.TV_2.Nodes(0).Nodes(int_2).Nodes.Add(.Item(int_1).c_名前)

                        Case 3 '3階層の場合
                            int_2 = Mid(.Item(int_1).c_住所, 1, 1)
                            int_3 = Mid(.Item(int_1).c_住所, 2, 1)
                            Me.TV_2.Nodes(0).Nodes(int_2).Nodes(int_3).Nodes.Add(.Item(int_1).c_名前)

                        Case 4 '4階層の場合

                        Case 5 '5階層の場合

                    End Select
                Next
            End With


    以上の手順でTreeView1からTreeView2へのノード構成の複製に成功しました。他にもっといい方法があるとは思いますが、時間もないことですしひとまずこれで行こうかと思います。。。。よい方法をご存知の方はぜひカキコ願います

    2006年11月21日 15:45