Imports System Imports System.Web Imports System.Web.UI Imports System.Collections Imports System.Data Namespace myControls _ Public Class DataBoundDataSet Inherits Control Private _dataSource As Object Private _dataMember As String = String.Empty Private _itemTemplate As ITemplate Public Property DataSource As Object Get Return _dataSource End Get Set _dataSource = Value End Set End Property Public Property DataMember As String Get Return _dataMember End Get Set _dataMember = Value End Set End Property Private Function GetDataSource( DataSource, DataMember ) As IEnumerable If TypeOf DataSource Is IEnumerable Then Return DataSource Else If TypeOf DataSource Is DataSet Then If DataMember <> String.Empty Then Return DataSource.Tables( DataMember ).DefaultView Else Return DataSource.Tables( 0 ).DefaultView End If Else Throw New ArgumentException( "Invalid data source!" ) End If End Function Protected Overrides Sub OnDataBinding( e As EventArgs ) Dim objDataEnum As IEnumerator Dim objItem As DataBoundDataSetItem Dim intCounter As Integer If Not DataSource Is Nothing Controls.Clear() ClearChildViewState() objDataEnum = GetDataSource( _dataSource, _dataMember ).GetEnumerator() While ( objDataEnum.MoveNext() ) objItem = New DataBoundDataSetItem( objDataEnum.Current ) ItemTemplate.InstantiateIn( objItem ) Controls.Add( objItem ) intCounter += 1 End While ViewState( "NumItems" ) = intCounter ChildControlsCreated = True End If End Sub Protected Overrides Sub CreateChildControls() Dim objNumItems As Object Dim intItemCount As Integer Dim intCounter As Integer Dim objItem As DataBoundDataSetItem objNumItems = ViewState( "NumItems" ) If Not objNumItems = Nothing Then Controls.Clear() intItemCount = CInt( objNumItems) For intCounter = 0 To intItemCount - 1 objItem = New DataBoundDataSetItem( Nothing ) ItemTemplate.InstantiateIn( objItem ) Controls.Add( objItem ) Next End If End Sub _ Public Property ItemTemplate As ITemplate Get Return _itemTemplate End Get Set _itemTemplate = value End Set End Property End Class Public Class DataBoundDataSetItem Inherits Control Implements INamingContainer Private _DataItem As Object Public Sub New( DataItem As Object ) MyBase.New() _DataItem = DataItem End Sub Public ReadOnly Property DataItem As Object Get Return _DataItem End Get End Property End Class End Namespace