// 指定ノードにすでに子ノードが追加されていない場合にのみ
// 以下の処理を実行
If (nodes.Count == 0) {
SqlConnection db = new SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet");
// 指定されたノードを親に持つ子ノード情報を取得
SqlCommand comm = new SqlCommand("SELECT url,title,target FROM sitemap WHERE parent=@parent", db);
comm.Parameters.Add("@parent", parent);
db.Open();
SqlDataReader reader = comm.ExecuteReader();
// 取得したDataReaderの内容をノード(TreeNodeオブジェクト)
// として追加
while (reader.Read()) {
TreeNode node = new TreeNode();
node.NavigateUrl = reader.GetString(0);
// 指定されたノードを親とする子ノードが存在するかをチェック
bool hasChildNodes(String parent) {
bool flag = false;
SqlConnection db = new SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet");
// 指定されたノードをキーに、子ノードを検索
SqlCommand comm = new SqlCommand("SELECT url FROM sitemap WHERE parent=@parent", db);
comm.Parameters.Add("@parent", parent);
db.Open();
SqlDataReader reader = comm.ExecuteReader();
' ページが初回ロードされたタイミングでツリーの最上位ノードを取得
Sub Page_Load(sender As Object, e As EventArgs)
If Not Page.IsPostBack Then
SetNewNode("-", tree.Nodes)
End If
End Sub
' ツリーの各ノードが展開されたタイミングで実行
Sub tree_Expand(sender As Object, e As TreeViewClickEventArgs)
Dim tmpNode As TreeNode
' イベント発生元のノードを取得
Dim tmpNodes As TreeNodeCollection = tree.Nodes
Dim nodeStep As String() = e.Node.Split(".")
For i As Integer = 0 To nodeStep.GetUpperBound(0)
tmpNode = tmpNodes.Item(nodeStep(i))
tmpNodes = tmpNode.Nodes
Next
' イベント発生元のノードを親に持つノード群をセット
SetNewNode(tmpNode.NavigateUrl,tmpNodes)
End Sub
' 指定されたノード(parent)を親に持つ子ノード群をセット
Sub SetNewNode(parent As String, nodes As TreeNodeCollection)
' 指定ノードにすでに子ノードが追加されていない場合にのみ
'以下の処理を実行
If nodes.Count = 0 Then
Dim db As New SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet")
' 指定されたノードを親に持つ子ノード情報を取得
Dim comm As New SqlCommand("SELECT url,title,target FROM sitemap WHERE parent=@parent", db)
comm.Parameters.Add("@parent", parent)
db.Open()
Dim reader As SqlDataReader = comm.ExecuteReader()
' 取得したDataReaderの内容をノード(TreeNodeオブジェクト)
'として追加
Do While reader.Read()
Dim node As New TreeNode()
node.NavigateUrl = reader.GetString(0)
node.Type="Folder"
' 取得したノードに子ノードが存在しない場合、ノード型を
' “Folder”に、かつ、ノードを展開可能な状態にセット。
' さもなければ、ノード型を“File”とする
If hasChildNodes(reader.GetString(0)) Then
node.Type = "Folder"
node.Expandable = ExpandableValue.Always
Else
node.Type = "File"
End If
node.Text = reader.GetString(1)
node.Target = reader.GetString(2)
nodes.Add(node)
Loop
db.Close()
End If
End Sub
' 指定されたノードを親とする子ノードが存在するかをチェック
Function hasChildNodes(parent As String) As Boolean
Dim flag As Boolean = False
Dim db As New SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet")
' 指定されたノードをキーに、子ノードを検索
Dim comm As New SqlCommand("SELECT url FROM sitemap WHERE parent=@parent", db)
comm.Parameters.Add("@parent", parent)
db.Open()
Dim reader As SqlDataReader = comm.ExecuteReader()
' マッチしたノードが存在した場合にのみフラグ変数flagにtrueをセット
If reader.HasRows Then flag = True
db.Close()
Return flag
End Function
</script>
<html>
<head>
<title>データベースからツリーメニューを生成</title>
</head>
<body>
<form runat="Server">
<ie:TreeView id="tree" runat="Server" AutoPostBack="True"
SystemImagesPath="/webctrl_client/1_0/treeimages/"
OnExpand="tree_Expand">
<ie:treenodetype Type="Folder"
ExpandedImageUrl="/webctrl_client/1_0/images/folderopen.gif"
ImageUrl="/webctrl_client/1_0/images/folder.gif" />
<ie:TreeNodeType Type="File"
ImageUrl="/webctrl_client/1_0/images/html.gif" />
</ie:TreeView>
</form>
</body>
</html>