G
Guest
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/folders/5113/download.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...
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/folders/5113/download.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...