Thanks Imar, unfortunately, the server I am using is only running .net 2.0 so I cant use Linq. After spending most of the day looking around, I eventually got it done with itemDataBinding and a horrible amount of code. I can see why you use linq for your examples. If anyone else wants it, here it is;
Code:
'aspx
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<b><asp:Label ID="Label1" runat="server" Text='<%# eval("[name]") %>'></asp:Label></b><br />
<asp:Repeater ID="Repeater2" runat="server">
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# eval("title") %>'></asp:Label><br />
</ItemTemplate>
</asp:Repeater>
<br />
</ItemTemplate>
</asp:Repeater>
'code behind
Imports System.Data
Imports System.Data.SqlClient
Partial Class management_hook_in
Inherits System.Web.UI.Page
Dim OrderRelation As DataRelation
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim dsResults As DataSet
Dim daGenres As SqlDataAdapter
Dim daReviews As SqlDataAdapter
Dim con As New SqlConnection(ConfigurationManager.ConnectionStrings("PlanetWroxConnectionString1").ConnectionString)
dsResults = New DataSet
'
daGenres = New SqlDataAdapter
daGenres.SelectCommand = con.CreateCommand()
daGenres.SelectCommand.CommandType = CommandType.Text
daGenres.SelectCommand.CommandText = "SELECT * FROM genre"
daGenres.Fill(dsResults, "Genres")
'
daReviews = New SqlDataAdapter
daReviews.SelectCommand = con.CreateCommand()
daReviews.SelectCommand.CommandType = CommandType.Text
daReviews.SelectCommand.CommandText = "SELECT * FROM [review]"
daReviews.Fill(dsResults, "Reviews")
'
'we now have the two tables.
'create a relationship between the two - the common column is genreID
'
OrderRelation = New DataRelation("OrderID_Relation", dsResults.Tables("Genres").Columns("ID"), dsResults.Tables("Reviews").Columns("GenreID"))
OrderRelation.Nested = True
'
'bind the data to the parent repeater
'
Me.Repeater1.DataSource = dsResults.Tables("Genres")
Me.Repeater1.DataBind()
End Sub
Protected Sub Repeater1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles Repeater1.ItemDataBound
Dim dv As DataRowView = TryCast(e.Item.DataItem, DataRowView)
If dv IsNot Nothing Then
Dim repeater2 As Repeater = TryCast(e.Item.FindControl("repeater2"), Repeater)
If repeater2 IsNot Nothing Then
repeater2.DataSource = dv.CreateChildView(OrderRelation)
repeater2.DataBind()
End If
End If
End Sub
End Class