トップ回答者
treeviewコントロールへのデータの取込

質問
-
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)
NextMe.txt_1.AppendText("</siteMapNode>" & vbCrLf & "</siteMap>")
End Sub
回答
-
treeviewに直接バインドはできないので、以下のように手動でやるしかないと思います。
Visual Basic .NET での XML データでの TreeView コントロールにデータを読み込む方法
http://support.microsoft.com/default.aspx?scid=kb;ja-jp;308063
すべての返信
-
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 -
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.コレクションを保存されていますか?もしよろしければご教授ください。私も早速調べることにします。
-
treeviewに直接バインドはできないので、以下のように手動でやるしかないと思います。
Visual Basic .NET での XML データでの TreeView コントロールにデータを読み込む方法
http://support.microsoft.com/default.aspx?scid=kb;ja-jp;308063 -
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へのノード構成の複製に成功しました。他にもっといい方法があるとは思いますが、時間もないことですしひとまずこれで行こうかと思います。。。。よい方法をご存知の方はぜひカキコ願います