Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > ASP .Net > Bug with nested repeaters. Item events are called twice per item

Reply
Thread Tools

Bug with nested repeaters. Item events are called twice per item

 
 
=?Utf-8?B?SmFtZXMgR2V1cnRz?=
Guest
Posts: n/a
 
      03-15-2007
On my page, I have one repeater that contains a literal control and a nested
repeater. The nested repeater contains a literal control. Both repeaters
are databound with only one object (string). But... and this is the crappy
part, the nested repeater's events are fired twice. How do I know this? I
setup global private counter variables that get incremented on the repeater's
ItemDataBound event. The outer repeater is correct and only calls the
ItemDataBound event once for each item, but the inner nested repeater calls
it's ItemDataBound event twice for each item.

It's worth mentioning that I did set AutoEventWireup to false, just in case...

You can review the markup and code or download the code
(http://www.biasecurities.com/files/f...ownload.aspx):

Default.aspx only has:

<asp:repeater ID="OuterRepeater" runat="server">
<ItemTemplate>
Outer ItemDataBind function called <asp:Literal
ID="MyText" runat="server" /> time(s)<br />

<asp:Repeater ID="InnerRepeater" runat="server">
<ItemTemplate>
Nested ItemDataBind function called
<asp:Literal ID="Text" runat="server" /> time(s)<br />

</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:repeater>

Default.aspx.cs contains:

protected override void OnInit(EventArgs e)
{
OuterRepeater.ItemCreated += new
RepeaterItemEventHandler(Outer_ItemCreated);
OuterRepeater.ItemDataBound += new
RepeaterItemEventHandler(Outer_ItemDataBound);
this.Load += new EventHandler(Page_Load);
base.OnInit(e);
}

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
List<string> myList = new List<string>();
myList.Add("1");
OuterRepeater.DataSource = myList;
OuterRepeater.DataBind();
}
}

void Outer_ItemCreated(object sender, RepeaterItemEventArgs e)
{
Repeater repeater = (Repeater)e.Item.FindControl("InnerRepeater");
if (repeater != null)
{
List<string> myList = new List<string>();
myList.Add("1.1");
repeater.ItemDataBound += new
RepeaterItemEventHandler(Inner_ItemDataBound);
repeater.DataSource = myList;
repeater.DataBind();
}
}

int outerCount = 0;

void Outer_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
outerCount++;
string myValue = (string)e.Item.DataItem;

Literal text = (Literal)e.Item.FindControl("MyText");
if (text != null)
{
text.Text = outerCount.ToString();
}
}

int innerCount = 0;

void Inner_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
innerCount++;
string myValue = (string)e.Item.DataItem;
Literal text = (Literal)e.Item.FindControl("Text");
text.Text = innerCount.ToString();
}

So at this point, I'm just confused... is this a bug with asp.net? if so...
damn, it seems pretty major, imo. Any help would be appreciated...
 
Reply With Quote
 
 
 
 
bruce barker
Guest
Posts: n/a
 
      03-16-2007
your are not checking the item type to see if its a Item or AlternateItem

-- bruce (sqlwork.com)

James Geurts wrote:
> On my page, I have one repeater that contains a literal control and a nested
> repeater. The nested repeater contains a literal control. Both repeaters
> are databound with only one object (string). But... and this is the crappy
> part, the nested repeater's events are fired twice. How do I know this? I
> setup global private counter variables that get incremented on the repeater's
> ItemDataBound event. The outer repeater is correct and only calls the
> ItemDataBound event once for each item, but the inner nested repeater calls
> it's ItemDataBound event twice for each item.
>
> It's worth mentioning that I did set AutoEventWireup to false, just in case...
>
> You can review the markup and code or download the code
> (http://www.biasecurities.com/files/f...ownload.aspx):
>
> Default.aspx only has:
>
> <asp:repeater ID="OuterRepeater" runat="server">
> <ItemTemplate>
> Outer ItemDataBind function called <asp:Literal
> ID="MyText" runat="server" /> time(s)<br />
>
> <asp:Repeater ID="InnerRepeater" runat="server">
> <ItemTemplate>
> Nested ItemDataBind function called
> <asp:Literal ID="Text" runat="server" /> time(s)<br />
>
> </ItemTemplate>
> </asp:Repeater>
> </ItemTemplate>
> </asp:repeater>
>
> Default.aspx.cs contains:
>
> protected override void OnInit(EventArgs e)
> {
> OuterRepeater.ItemCreated += new
> RepeaterItemEventHandler(Outer_ItemCreated);
> OuterRepeater.ItemDataBound += new
> RepeaterItemEventHandler(Outer_ItemDataBound);
> this.Load += new EventHandler(Page_Load);
> base.OnInit(e);
> }
>
> protected void Page_Load(object sender, EventArgs e)
> {
> if (!IsPostBack)
> {
> List<string> myList = new List<string>();
> myList.Add("1");
> OuterRepeater.DataSource = myList;
> OuterRepeater.DataBind();
> }
> }
>
> void Outer_ItemCreated(object sender, RepeaterItemEventArgs e)
> {
> Repeater repeater = (Repeater)e.Item.FindControl("InnerRepeater");
> if (repeater != null)
> {
> List<string> myList = new List<string>();
> myList.Add("1.1");
> repeater.ItemDataBound += new
> RepeaterItemEventHandler(Inner_ItemDataBound);
> repeater.DataSource = myList;
> repeater.DataBind();
> }
> }
>
> int outerCount = 0;
>
> void Outer_ItemDataBound(object sender, RepeaterItemEventArgs e)
> {
> outerCount++;
> string myValue = (string)e.Item.DataItem;
>
> Literal text = (Literal)e.Item.FindControl("MyText");
> if (text != null)
> {
> text.Text = outerCount.ToString();
> }
> }
>
> int innerCount = 0;
>
> void Inner_ItemDataBound(object sender, RepeaterItemEventArgs e)
> {
> innerCount++;
> string myValue = (string)e.Item.DataItem;
> Literal text = (Literal)e.Item.FindControl("Text");
> text.Text = innerCount.ToString();
> }
>
> So at this point, I'm just confused... is this a bug with asp.net? if so...
> damn, it seems pretty major, imo. Any help would be appreciated...

 
Reply With Quote
 
 
 
 
=?Utf-8?B?SmFtZXMgR2V1cnRz?=
Guest
Posts: n/a
 
      03-16-2007
I don't see how that even applies to this situation. item events should only
be called once per item regardless of if it is an Item or AlternateItem.

Anyone from MS want to help with this?

Thanks

Jim

"bruce barker" wrote:

> your are not checking the item type to see if its a Item or AlternateItem
>
> -- bruce (sqlwork.com)
>
> James Geurts wrote:
> > On my page, I have one repeater that contains a literal control and a nested
> > repeater. The nested repeater contains a literal control. Both repeaters
> > are databound with only one object (string). But... and this is the crappy
> > part, the nested repeater's events are fired twice. How do I know this? I
> > setup global private counter variables that get incremented on the repeater's
> > ItemDataBound event. The outer repeater is correct and only calls the
> > ItemDataBound event once for each item, but the inner nested repeater calls
> > it's ItemDataBound event twice for each item.
> >
> > It's worth mentioning that I did set AutoEventWireup to false, just in case...
> >
> > You can review the markup and code or download the code
> > (http://www.biasecurities.com/files/f...ownload.aspx):
> >
> > Default.aspx only has:
> >
> > <asp:repeater ID="OuterRepeater" runat="server">
> > <ItemTemplate>
> > Outer ItemDataBind function called <asp:Literal
> > ID="MyText" runat="server" /> time(s)<br />
> >
> > <asp:Repeater ID="InnerRepeater" runat="server">
> > <ItemTemplate>
> > Nested ItemDataBind function called
> > <asp:Literal ID="Text" runat="server" /> time(s)<br />
> >
> > </ItemTemplate>
> > </asp:Repeater>
> > </ItemTemplate>
> > </asp:repeater>
> >
> > Default.aspx.cs contains:
> >
> > protected override void OnInit(EventArgs e)
> > {
> > OuterRepeater.ItemCreated += new
> > RepeaterItemEventHandler(Outer_ItemCreated);
> > OuterRepeater.ItemDataBound += new
> > RepeaterItemEventHandler(Outer_ItemDataBound);
> > this.Load += new EventHandler(Page_Load);
> > base.OnInit(e);
> > }
> >
> > protected void Page_Load(object sender, EventArgs e)
> > {
> > if (!IsPostBack)
> > {
> > List<string> myList = new List<string>();
> > myList.Add("1");
> > OuterRepeater.DataSource = myList;
> > OuterRepeater.DataBind();
> > }
> > }
> >
> > void Outer_ItemCreated(object sender, RepeaterItemEventArgs e)
> > {
> > Repeater repeater = (Repeater)e.Item.FindControl("InnerRepeater");
> > if (repeater != null)
> > {
> > List<string> myList = new List<string>();
> > myList.Add("1.1");
> > repeater.ItemDataBound += new
> > RepeaterItemEventHandler(Inner_ItemDataBound);
> > repeater.DataSource = myList;
> > repeater.DataBind();
> > }
> > }
> >
> > int outerCount = 0;
> >
> > void Outer_ItemDataBound(object sender, RepeaterItemEventArgs e)
> > {
> > outerCount++;
> > string myValue = (string)e.Item.DataItem;
> >
> > Literal text = (Literal)e.Item.FindControl("MyText");
> > if (text != null)
> > {
> > text.Text = outerCount.ToString();
> > }
> > }
> >
> > int innerCount = 0;
> >
> > void Inner_ItemDataBound(object sender, RepeaterItemEventArgs e)
> > {
> > innerCount++;
> > string myValue = (string)e.Item.DataItem;
> > Literal text = (Literal)e.Item.FindControl("Text");
> > text.Text = innerCount.ToString();
> > }
> >
> > So at this point, I'm just confused... is this a bug with asp.net? if so...
> > damn, it seems pretty major, imo. Any help would be appreciated...

>

 
Reply With Quote
 
=?Utf-8?B?SmFtZXMgR2V1cnRz?=
Guest
Posts: n/a
 
      03-24-2007
Hello? Anyone have an answer for this?

"James Geurts" wrote:

> On my page, I have one repeater that contains a literal control and a nested
> repeater. The nested repeater contains a literal control. Both repeaters
> are databound with only one object (string). But... and this is the crappy
> part, the nested repeater's events are fired twice. How do I know this? I
> setup global private counter variables that get incremented on the repeater's
> ItemDataBound event. The outer repeater is correct and only calls the
> ItemDataBound event once for each item, but the inner nested repeater calls
> it's ItemDataBound event twice for each item.
>
> It's worth mentioning that I did set AutoEventWireup to false, just in case...
>
> You can review the markup and code or download the code
> (http://www.biasecurities.com/files/f...ownload.aspx):
>
> Default.aspx only has:
>
> <asp:repeater ID="OuterRepeater" runat="server">
> <ItemTemplate>
> Outer ItemDataBind function called <asp:Literal
> ID="MyText" runat="server" /> time(s)<br />
>
> <asp:Repeater ID="InnerRepeater" runat="server">
> <ItemTemplate>
> Nested ItemDataBind function called
> <asp:Literal ID="Text" runat="server" /> time(s)<br />
>
> </ItemTemplate>
> </asp:Repeater>
> </ItemTemplate>
> </asp:repeater>
>
> Default.aspx.cs contains:
>
> protected override void OnInit(EventArgs e)
> {
> OuterRepeater.ItemCreated += new
> RepeaterItemEventHandler(Outer_ItemCreated);
> OuterRepeater.ItemDataBound += new
> RepeaterItemEventHandler(Outer_ItemDataBound);
> this.Load += new EventHandler(Page_Load);
> base.OnInit(e);
> }
>
> protected void Page_Load(object sender, EventArgs e)
> {
> if (!IsPostBack)
> {
> List<string> myList = new List<string>();
> myList.Add("1");
> OuterRepeater.DataSource = myList;
> OuterRepeater.DataBind();
> }
> }
>
> void Outer_ItemCreated(object sender, RepeaterItemEventArgs e)
> {
> Repeater repeater = (Repeater)e.Item.FindControl("InnerRepeater");
> if (repeater != null)
> {
> List<string> myList = new List<string>();
> myList.Add("1.1");
> repeater.ItemDataBound += new
> RepeaterItemEventHandler(Inner_ItemDataBound);
> repeater.DataSource = myList;
> repeater.DataBind();
> }
> }
>
> int outerCount = 0;
>
> void Outer_ItemDataBound(object sender, RepeaterItemEventArgs e)
> {
> outerCount++;
> string myValue = (string)e.Item.DataItem;
>
> Literal text = (Literal)e.Item.FindControl("MyText");
> if (text != null)
> {
> text.Text = outerCount.ToString();
> }
> }
>
> int innerCount = 0;
>
> void Inner_ItemDataBound(object sender, RepeaterItemEventArgs e)
> {
> innerCount++;
> string myValue = (string)e.Item.DataItem;
> Literal text = (Literal)e.Item.FindControl("Text");
> text.Text = innerCount.ToString();
> }
>
> So at this point, I'm just confused... is this a bug with asp.net? if so...
> damn, it seems pretty major, imo. Any help would be appreciated...

 
Reply With Quote
 
=?Utf-8?B?SmFtZXMgR2V1cnRz?=
Guest
Posts: n/a
 
      03-28-2007
Got a reply from Microsoft:

"The repeater calls databind on all its item children in the ItemDataBound
event. So the inner repeater is databound once by the outer databound, and
once by you in your Outer_ItemCreated event handler. To make the inner
repeater bind just once, remove the call to DataBind in Outer_ItemCreated."

Hope that helps someone...


"James Geurts" wrote:

> On my page, I have one repeater that contains a literal control and a nested
> repeater. The nested repeater contains a literal control. Both repeaters
> are databound with only one object (string). But... and this is the crappy
> part, the nested repeater's events are fired twice. How do I know this? I
> setup global private counter variables that get incremented on the repeater's
> ItemDataBound event. The outer repeater is correct and only calls the
> ItemDataBound event once for each item, but the inner nested repeater calls
> it's ItemDataBound event twice for each item.
>
> It's worth mentioning that I did set AutoEventWireup to false, just in case...
>
> You can review the markup and code or download the code
> (http://www.biasecurities.com/files/f...ownload.aspx):
>
> Default.aspx only has:
>
> <asp:repeater ID="OuterRepeater" runat="server">
> <ItemTemplate>
> Outer ItemDataBind function called <asp:Literal
> ID="MyText" runat="server" /> time(s)<br />
>
> <asp:Repeater ID="InnerRepeater" runat="server">
> <ItemTemplate>
> Nested ItemDataBind function called
> <asp:Literal ID="Text" runat="server" /> time(s)<br />
>
> </ItemTemplate>
> </asp:Repeater>
> </ItemTemplate>
> </asp:repeater>
>
> Default.aspx.cs contains:
>
> protected override void OnInit(EventArgs e)
> {
> OuterRepeater.ItemCreated += new
> RepeaterItemEventHandler(Outer_ItemCreated);
> OuterRepeater.ItemDataBound += new
> RepeaterItemEventHandler(Outer_ItemDataBound);
> this.Load += new EventHandler(Page_Load);
> base.OnInit(e);
> }
>
> protected void Page_Load(object sender, EventArgs e)
> {
> if (!IsPostBack)
> {
> List<string> myList = new List<string>();
> myList.Add("1");
> OuterRepeater.DataSource = myList;
> OuterRepeater.DataBind();
> }
> }
>
> void Outer_ItemCreated(object sender, RepeaterItemEventArgs e)
> {
> Repeater repeater = (Repeater)e.Item.FindControl("InnerRepeater");
> if (repeater != null)
> {
> List<string> myList = new List<string>();
> myList.Add("1.1");
> repeater.ItemDataBound += new
> RepeaterItemEventHandler(Inner_ItemDataBound);
> repeater.DataSource = myList;
> repeater.DataBind();
> }
> }
>
> int outerCount = 0;
>
> void Outer_ItemDataBound(object sender, RepeaterItemEventArgs e)
> {
> outerCount++;
> string myValue = (string)e.Item.DataItem;
>
> Literal text = (Literal)e.Item.FindControl("MyText");
> if (text != null)
> {
> text.Text = outerCount.ToString();
> }
> }
>
> int innerCount = 0;
>
> void Inner_ItemDataBound(object sender, RepeaterItemEventArgs e)
> {
> innerCount++;
> string myValue = (string)e.Item.DataItem;
> Literal text = (Literal)e.Item.FindControl("Text");
> text.Text = innerCount.ToString();
> }
>
> So at this point, I'm just confused... is this a bug with asp.net? if so...
> damn, it seems pretty major, imo. Any help would be appreciated...

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
ObjectDataSource - query being performed twice per page load? dave.dolan ASP .Net Web Controls 3 05-19-2006 01:14 PM
Page Submission Events are called twice =?Utf-8?B?UmFqZWV2?= ASP .Net 0 05-17-2006 04:47 PM
twice(twice(x)) Kiuhnm C++ 2 04-01-2006 04:41 PM
Events Events Events Please Help Chris ASP .Net Web Controls 0 08-30-2005 08:21 PM
Per-to-Per is OK but no ICS Jens Mander Wireless Networking 4 01-23-2005 10:24 PM



Advertisments