Neil: Seems the TreeView Control would be a good approach. Here's some example code from a reference I have; perhaps it can help.
SimpleTreeView.aspx
<%@Import Namespace = "System.Web.UI.HtmlControls"%>
<%@ Register TagPrefix="IE" Namespace="Web.UI.WebControls"%>
Assembly="Microsoft.Web.UI.WebControls" %>
<html>
<head><title>...</title></head>
<body>
<form runat="server">
<IE:TreeView
Runat="server">
<TreeNode 'imports MS.Web.UI.WebControls Namespace
Runat="server">
<TreeNode
Text="Invertebrates">
<TreeNode
Text="Vertebrates">
<TreeNode
Text="Plants">
<TreeNode
Text="Algae">
</TreeNode>
</ID:TreeView>
</form>
</body>
</html>
TreeView is not part of the core ASP.NET Framework, so the namespace must be explicitly imported to refer to classes in the IE WebControls assembly.
IE Tag prefix is registered for the IE WebControls. Registering the prefix maps the prefix to the proper namespace for the controls.
If you want to detect when users select a particular node, you need to capture the SelectedIndexChanged event. Here's some more example code which demonstrates a subroutine associated with this event.
TreeViewSelectedIndexChanged.aspx
<%@....%> etc
<Script runat="server">
Sub TreeView_SelectedIndexChanged (s As Object, e As TreeViewSelectEventArgs)
lblSelectedNode.Text = treeBooks.GetNodeFromIndex(e.NewNode).Text
End Sub
</script>
<html>
.....
<form runat="server">
<IE:TreeView
id="treeBooks"
AutoPostBack="true"
OnSelectedIndexChanged="TreeView_SelectedIndexChanged"
Runat="server">
<TreeNode
Text="ASP.NET Books">
<TreeView
Text="ASP.NET Unleased" />
<TreeView
Text="ASP Tips, Code" />
</TreeNode>
</IE:TreeView>
<p>
<asp:Label id="lblSelectNode"
Runat="server" />
</form>
...
</html>
...from S. Walther (good reference)