469,945 Members | 1,813 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,945 developers. It's quick & easy.

Problem binding DataGrid nested inside Repeater

I am using the OnItemDataBound event of Repeater control to nest a
DataGrid within the Repeater. When I attempt to bind to the DataGrid
using the DataSource method I get the error message "Object reference
not set to an instance of an object". This error message commonly
occurs when a server control is incorrecly declared, so naturally I
have double checked this.

To test this, I moved the aspx code for the DataGrid
('myNestedDataGrid') outside the Repeater ('myRepeater') and it bound
without problem.

I know that you can nest a DataGrid within a Repeater, but I must be
missing something:

<code_behind>

'-- Declare server controls
Protected WithEvents myRepeater As System.Web.UI.WebControls.Repeater
Protected WithEvents myNestedDataGrid As
System.Web.UI.WebControls.DataGrid

'-- Define page wide variable to hold nested data source
Private mDataView As DataView

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

Dim myDataSet As DataSet = getRepeater

mDataView = myDataSet.Tables("myTable").DefaultView

myRepeater.DataSource() = mDataView
myRepeater.DataBind()

End Sub

Public Sub myRepeater_ItemBound(ByVal sender As System.Object, ByVal
e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles
myRepeater.ItemDataBound

Dim lngIdx As Integer = e.Item.ItemIndex
If lngIdx > -1 Then

myNestedDataGrid.DataSource =
getNestedDataGrid(mDataView(lngIdx).Row("ItemID")) .Tables("myNestedTable").DefaultView
myNestedDataGrid.DataBind()

End If

End Sub

Private Function getRepeater() As DataSet
'-- Return DataSet
End Function

Private Function getNestedDataGrid(ByVal ItemID As Long) As DataSet
'-- Return DataSet, using ItemID as primary key
End Function

</code_behind>

<aspx_that_fails>

<asp:Repeater id="myRepeater" runat="Server"
OnItemDataBound="myRepeater_ItemBound">
<ItemTemplate>
<b><%# DataBinder.Eval(Container.DataItem, "ItemName") %></b>
<asp:datagrid id="myNestedDataGrid">
<columns>
<asp:boundcolumn datafield="Field1"></asp:boundcolumn>
<asp:boundcolumn datafield="Field2"></asp:boundcolumn>
<asp:boundcolumn datafield="Field3"></asp:boundcolumn>
</columns>
</asp:datagrid>
</ItemTemplate>
</asp:Repeater>

</aspx_that_fails>

<aspx_that_works>

<asp:Repeater id="myRepeater" runat="Server"
OnItemDataBound="myRepeater_ItemBound">
<ItemTemplate>
<b><%# DataBinder.Eval(Container.DataItem, "ItemName") %></b>
</ItemTemplate>
</asp:Repeater>
<asp:datagrid id="myNestedDataGrid">
<columns>
<asp:boundcolumn datafield="Field1"></asp:boundcolumn>
<asp:boundcolumn datafield="Field2"></asp:boundcolumn>
<asp:boundcolumn datafield="Field3"></asp:boundcolumn>
</columns>
</asp:datagrid>

</aspx_that_works>
Nov 17 '05 #1
2 3045
are you sure that you can an control inside another and yet still be able to
reference it??
i think i have tried this before without success either.

"Stephen Miller" <js******@hotmail.com> wrote in message
news:cd**************************@posting.google.c om...
I am using the OnItemDataBound event of Repeater control to nest a
DataGrid within the Repeater. When I attempt to bind to the DataGrid
using the DataSource method I get the error message "Object reference
not set to an instance of an object". This error message commonly
occurs when a server control is incorrecly declared, so naturally I
have double checked this.

To test this, I moved the aspx code for the DataGrid
('myNestedDataGrid') outside the Repeater ('myRepeater') and it bound
without problem.

I know that you can nest a DataGrid within a Repeater, but I must be
missing something:

<code_behind>

'-- Declare server controls
Protected WithEvents myRepeater As System.Web.UI.WebControls.Repeater
Protected WithEvents myNestedDataGrid As
System.Web.UI.WebControls.DataGrid

'-- Define page wide variable to hold nested data source
Private mDataView As DataView

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

Dim myDataSet As DataSet = getRepeater

mDataView = myDataSet.Tables("myTable").DefaultView

myRepeater.DataSource() = mDataView
myRepeater.DataBind()

End Sub

Public Sub myRepeater_ItemBound(ByVal sender As System.Object, ByVal
e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles
myRepeater.ItemDataBound

Dim lngIdx As Integer = e.Item.ItemIndex
If lngIdx > -1 Then

myNestedDataGrid.DataSource =
getNestedDataGrid(mDataView(lngIdx).Row("ItemID")) .Tables("myNestedTable").D
efaultView myNestedDataGrid.DataBind()

End If

End Sub

Private Function getRepeater() As DataSet
'-- Return DataSet
End Function

Private Function getNestedDataGrid(ByVal ItemID As Long) As DataSet
'-- Return DataSet, using ItemID as primary key
End Function

</code_behind>

<aspx_that_fails>

<asp:Repeater id="myRepeater" runat="Server"
OnItemDataBound="myRepeater_ItemBound">
<ItemTemplate>
<b><%# DataBinder.Eval(Container.DataItem, "ItemName") %></b>
<asp:datagrid id="myNestedDataGrid">
<columns>
<asp:boundcolumn datafield="Field1"></asp:boundcolumn>
<asp:boundcolumn datafield="Field2"></asp:boundcolumn>
<asp:boundcolumn datafield="Field3"></asp:boundcolumn>
</columns>
</asp:datagrid>
</ItemTemplate>
</asp:Repeater>

</aspx_that_fails>

<aspx_that_works>

<asp:Repeater id="myRepeater" runat="Server"
OnItemDataBound="myRepeater_ItemBound">
<ItemTemplate>
<b><%# DataBinder.Eval(Container.DataItem, "ItemName") %></b>
</ItemTemplate>
</asp:Repeater>
<asp:datagrid id="myNestedDataGrid">
<columns>
<asp:boundcolumn datafield="Field1"></asp:boundcolumn>
<asp:boundcolumn datafield="Field2"></asp:boundcolumn>
<asp:boundcolumn datafield="Field3"></asp:boundcolumn>
</columns>
</asp:datagrid>

</aspx_that_works>

Nov 17 '05 #2
It can be done (sort of)
In the HTML of your datagrid put a reference to a data source...
<asp:DataGrid id=DataGrid1 runat="server" AutogenerateColumns="False"
DataSource='<%# getGridDataSource( ctype(DataBinder.Eval(Container.DataItem,
"CustomerID"),string) ) %>'

Whats going on here is... When a row of your repeater binds, a data grid is
created & the data source calls a function called getGridDataSource. THE
IMPORTANT BIT is the DataBinder.Eval(Container.DataItem, "CustomerID") that
is passed to getGridDataSource. The Container.DataItem is the Current
Reapeater Row. so... You key together a piece of data from the current
Repeater row with the datasource of the data grid - so that the content of
the data grid is relevant to the current repeater row!

Now, when the datagrids bind, you can have a handler for
OnItemDataBound='<%# whatever....%> & get a reference to the grid.

"Stephen Miller" <js******@hotmail.com> wrote in message
news:cd**************************@posting.google.c om...
I am using the OnItemDataBound event of Repeater control to nest a
DataGrid within the Repeater. When I attempt to bind to the DataGrid
using the DataSource method I get the error message "Object reference
not set to an instance of an object". This error message commonly
occurs when a server control is incorrecly declared, so naturally I
have double checked this.

To test this, I moved the aspx code for the DataGrid
('myNestedDataGrid') outside the Repeater ('myRepeater') and it bound
without problem.

I know that you can nest a DataGrid within a Repeater, but I must be
missing something:

<code_behind>

'-- Declare server controls
Protected WithEvents myRepeater As System.Web.UI.WebControls.Repeater
Protected WithEvents myNestedDataGrid As
System.Web.UI.WebControls.DataGrid

'-- Define page wide variable to hold nested data source
Private mDataView As DataView

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

Dim myDataSet As DataSet = getRepeater

mDataView = myDataSet.Tables("myTable").DefaultView

myRepeater.DataSource() = mDataView
myRepeater.DataBind()

End Sub

Public Sub myRepeater_ItemBound(ByVal sender As System.Object, ByVal
e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles
myRepeater.ItemDataBound

Dim lngIdx As Integer = e.Item.ItemIndex
If lngIdx > -1 Then

myNestedDataGrid.DataSource =
getNestedDataGrid(mDataView(lngIdx).Row("ItemID")) .Tables("myNestedTable").D
efaultView myNestedDataGrid.DataBind()

End If

End Sub

Private Function getRepeater() As DataSet
'-- Return DataSet
End Function

Private Function getNestedDataGrid(ByVal ItemID As Long) As DataSet
'-- Return DataSet, using ItemID as primary key
End Function

</code_behind>

<aspx_that_fails>

<asp:Repeater id="myRepeater" runat="Server"
OnItemDataBound="myRepeater_ItemBound">
<ItemTemplate>
<b><%# DataBinder.Eval(Container.DataItem, "ItemName") %></b>
<asp:datagrid id="myNestedDataGrid">
<columns>
<asp:boundcolumn datafield="Field1"></asp:boundcolumn>
<asp:boundcolumn datafield="Field2"></asp:boundcolumn>
<asp:boundcolumn datafield="Field3"></asp:boundcolumn>
</columns>
</asp:datagrid>
</ItemTemplate>
</asp:Repeater>

</aspx_that_fails>

<aspx_that_works>

<asp:Repeater id="myRepeater" runat="Server"
OnItemDataBound="myRepeater_ItemBound">
<ItemTemplate>
<b><%# DataBinder.Eval(Container.DataItem, "ItemName") %></b>
</ItemTemplate>
</asp:Repeater>
<asp:datagrid id="myNestedDataGrid">
<columns>
<asp:boundcolumn datafield="Field1"></asp:boundcolumn>
<asp:boundcolumn datafield="Field2"></asp:boundcolumn>
<asp:boundcolumn datafield="Field3"></asp:boundcolumn>
</columns>
</asp:datagrid>

</aspx_that_works>

Nov 17 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

reply views Thread by Maziar Aflatoun | last post: by
7 posts views Thread by Scott Schluer | last post: by
2 posts views Thread by James Moore | last post: by
2 posts views Thread by Colin Nicholls | last post: by
3 posts views Thread by Maverick | last post: by
1 post views Thread by Maziar Aflatoun | last post: by
3 posts views Thread by Maziar Aflatoun | last post: by
12 posts views Thread by =?Utf-8?B?Qi4gQ2hlcm5pY2s=?= | last post: by
2 posts views Thread by =?Utf-8?B?Y3JlYXZlczA2MjI=?= | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.