Scott on Writing

Musings on technical writing...

Control Building and ViewState Redux

Earlier this week I posted an entry titled Control Building and ViewState Lesson for the Day, in which I discussed when working with dynamic controls the importance of the order with which a control is added and its properties are set.  My end recommendation was to use the following pattern:

  1. Create an instance of the control (i.e., TextBox tb = new TextBox();)
  2. Add the control to the appropriate Controls collection (i.e., PlaceHolderID.Controls.Add(tb);)
  3. Set the dynamic control's properties (i.e., tb.ForeColor = Color.Red;)

The key lesson was to make sure you do step 2 before step 3, or you may be plauged with view state issues.  In that previous blog entry I mentioned that the reason this happens is because if the control is added after the TrackViewState stage in the page lifecycle (such as in the Load stage), then any changes to the control's properties are not recorded by view state, so nothing gets saved to view state and so nothing on postback gets populated back into the control's view state.  However, I said that adding a control via the Controls.Add() method causes the controls TrackViewState() method to be called.  This is correct, but it's not a complete answer.

Not only is the TrackViewState() method being called for the added control, but it goes through the entire control lifecycle, if needed.  Using Reflector you can see that the control's InitRecursive() method is called, which fires the Init event for the added control and all of its children controls (this also is where the control's TrackViewState() method is invoked).  If the control that is having the dynamic control added to it has a non-null ViewState, the control being added has it's LoadViewStateRecursive() method called, which loads the view state into the added control and its child controls.  But things don't end there necessarily.  If the control that had the dynamic control added to it has already fired its Load event, the added control's Load event is fired (recursively, again), and even the PreRender event is fired if needed.

One final point to clear up: in my previous blog entry I credited Alex Lowe with being the one whose words from 2001 had reminded me that I needed to add the control first and then set its properties.  Memory's a funny thing, really, since I remembered Alex's words, but I had totally blanked on an email Wessam Zeidan had sent me in late September 2004 where he talked about the same thing, saying: “... some how when we add a dynamic control to the Controls collection, the TrackViewState method gets called, and that explains why the backcolor property of the textbox gets saved to the viewstate if we add the textbox to the controls collection before setting it.”  And if that wasn't enough, I realized that I said the same thing myself in my MSDN article Understanding ASP.NET View State:

You may be able to get away with loading your controls in the Page_Load event handler and maintaining the view state properly. It all depends on whether or not you are setting any properties of the dynamically loaded controls programmatically and, if so, when you're doing it relative to the Controls.Add(dynamicControl) line. A thorough discussion of this is a bit beyond the scope of this article, but the reason it may work is because the Controls property's Add() method recursively loads the parent's view state into its children, even though the load view state stage has passed.

It's funny how our minds work, and how fluid memory can truly be.

posted on Friday, October 08, 2004 8:35 AM

Feedback

# re: Control Building and ViewState Redux 10/8/2004 10:24 AM Wessam Zeidan

Thanks Scott

# re: Control Building and ViewState Redux 10/11/2004 12:36 PM Mike Singer

Scott Mitchell wrote:

>My end recommendation was to use
>the following pattern:
>1. Create an instance of the control
> (i.e., TextBox tb = new TextBox();)
>2. Add the control to the appropriate
>Controls collection (i.e.,
> PlaceHolderID.Controls.Add(tb);)
>3. Set the dynamic control's properties
>(i.e., tb.ForeColor = Color.Red;)
>…One final point to clear up: … had reminded
>me that I needed to add the control first
>and then set its properties.


From: “Dynamic Web Controls, Postbacks, and View State” By Scott Mitchell:


>As we saw in this article, the general
>pattern to follow is:
>1.Add the dynamic controls on each page
>visit in the page's Initialization stage,
>2. Read/write the dynamic controls'
>properties and methods in the Page_Load
>event handler.


Scott,
the list of patterns on adding dynamic controls semms to be pretty dynamic itself :-)

Regards,
Mike.

PS: How about yet another pattern with getting on Page_Load dynamic controls properties from

Dim thisPage As System.Web.UI.Page = CType(Context.Handler, System.Web.UI.Page)

Dim oPlaceHolder As PlaceHolder = CType(thisPage.FindControl("PlaceHolder1"), System.Web.UI.Control)

CType(PlaceHolder1.Controls(0), TextBox).Text = CType(oPlaceHolder.Controls(0), TextBox).Text

combined with “Server.Transfer” self-redirection?

(PlaceHolder1 – static control; some TextBox – dynamic)

# re: Control Building and ViewState Redux 10/11/2004 1:51 PM Scott Mitchell

Mike, you're right, it is a bit dynamic, it works either way. Personally, I'd recommend adding controls in the Init stage if possible, and let the natural LoadViewState stage handle repopulation of the view state, but there may be instances where you need to wait until the Load stage to load the controls, and in that case it is important on the order of adding controls and setting properties.

# re: Control Building and ViewState Redux 10/12/2004 12:59 AM Wessam Zeidan

Yes Scott, actually what made me add the controls at page load was because I wanted to add these dynamic controls according to a value I saved in the pages viewstate from the previous request, which can't be done in the Init stage since the viewstate wouldn't be loaded then

# re: Control Building and ViewState Redux 10/12/2004 2:40 PM Dave Bacher

In general, most scenarios where you add/remove controls dynamically can be avoided entirely.

For example:
<asp:Panel id="somePanel" visible="true">
<!-- controls go here -->
</asp:Panel>

Then in code:
somePanel.Visible = User.IsInRole("PanelRole");

I use dynamic controls alot, also, but in a lot of cases, just hiding a panel that a bunch of controls are on, or hiding an individual control makes more sense.

The reason I say this is because it lets you still use the visual studio tools on the control, etc.

Major drawbacks are that all processing still occurs, and that the controls are still shown on the user side. Regardless of this, if you have a single page or object handling requests from multiple security levels, etc., you still have to perform all validation, etc. because otherwise the dynamic field can be attacked to drill a hole in the page.

# re: Control Building and ViewState Redux 10/12/2004 2:42 PM Dave Bacher

(and by still shown I mean in page source, they are (of course) invisible in the browser)

# re: Control Building and ViewState Redux 10/12/2004 2:53 PM Scott Mitchell

Dave, that approach works well if you have a static set of controls that will be shown or hidden based on some criteria, but there are a number of situations where the actual controls to be displayed depend on external criteria. A canonical example would be a survey, whose questions and the inputs that should be used for them are not known until run-time.

# re: Control Building and ViewState Redux 10/12/2004 10:59 PM Wessam Zeidan

And also the viewstate of the hidden controls will be saved, which increases the size of the response sent to the browser. I had around 7 user controls and I wanted to show one of them according to a certain criteria, hiding 6 and showing 1 caused a problem for me, especialy with the size of the viewstate...

# re: Control Building and ViewState Redux 10/14/2004 12:44 AM Hilton Giesenow

Scott, I'm with you completely about sometimes having to add controls dynamically. I just had to build an entire grid of freeform textboxes dynamically!

What I have noticed that is in line with everything you have been speaking about here but has not been stated explicitly is that it seems that you can only wire an event to a control properly (i.e. AddHandler in VB.Net) once it has been added to the controls collection. Have you seen this as well at all?

# re: Control Building and ViewState Redux 10/14/2004 12:56 PM Mike Singer

>>>>>>>>>>>>>>>>
Personally, I'd recommend adding controls in the Init stage if possible, and let the natural LoadViewState stage handle repopulation of the view state…
>>>>>>>>>>>>>>>>

Yes, I know, MS recommended it in Q317515 “HOW TO”. But I can’t make myself love the concept “once loaded and many times initialized”; just for the lack of conceptual consistency as I perceive it.

I’d prefer that “Init capsule” would start once and embrace all things needed to provide the page life-circle including This-Page-Dedicated-Engine. And then inner “Load capsule” would start on each postback, without going out of “Init capsule” boundaries.

So, just out of the aesthetics I prefer to combine each postback with self-“server.transfer” or even “response.redirect”, creating and populating dynamic controls according to data stored in session vars.

The reason of using dynamic controls is that I tried but failed make myself love “codeless programming”; I mean a datagrid bound to dataset, much like as in the Dino Esposito’s best practices. Pretty often it’s easier to me to stuff some static table web control with dynamic controls. And this stuffing is based on some array received from data access layer where it gets dumped from a datareader.

Mike.

# re: Control Building and ViewState Redux 12/1/2004 11:02 AM Charles Richardson

Adding controls dynamically to a web form works fine for me, but if I do the same thing inside a User Control, FindControl no longer finds any of the dynamically-added controls. The values are there, and remain after postback, so I know I'm adding the controls at the right time, but darned if I can find the controls at all to access what's in them. Any ideas?

# re: Control Building and ViewState Redux 1/27/2005 9:15 AM Mark Gibson

I am having the same problem that Charles had. Has anybody else come across this and resolved it?

# re: Control Building and ViewState Redux 2/14/2005 8:51 AM Ryan Hefner

I have also been experiencing the same problem. For some reason I am unable to find the controls when enumberating through all the controls on the page, but the dynamic control values appear within the Form Collection in the Trace. Does any one know how to directly access the values stored within the Form Collection for a given control?

# re: Control Building and ViewState Redux 2/22/2005 1:43 PM Nilay

I am also facing the same problem as Ryan Hefner is facing. Another problem is that I can see the name in Forms Collection But since it is part of user control i see _ctl0_ or _ctl1 added to it. And so dont know how to retrieve values from Form collection.

# re: Control Building and ViewState Redux 3/3/2005 1:17 PM Nelzon

Firstly, I would like to thank Scott Mitchell for writing excellent articles and books describing the world av asp.net.

Regarding dynamically adding controls and user controls, I have used two scenarios.

1. Using a table and add all the controls with setting the IDs after controls.add, which worked fine but got quite messy. I used one method for adding the controls, and in page.load i invoked the method on every postback as well. This, combined with hidden panels did the work. I also added user controls, and it worked fine.

2. In a new project, I tried out Denis Bauers DynamicPlaceholder Control, which is a free control (www.denisbauer.com). this allows me to add user controls with extensive logic to the page, and it is all a dream to work with, but viewstate gets big.

I am now thinking that the overall best way to do the dynamic adding of user controls, without getting the viewstate size through the roof, is to implement server controls. More work, but better performance. I am still searching for the best solution, and hope my contribution to this thread can result in a common best practice for dynamically adding controls (with more logic than textbox and button) and still have good performance.

Cheers

# re: Control Building and ViewState Redux 3/15/2005 11:41 AM JohnBao

It seems without this methods, viewstate still won't work.


public override ControlCollection Controls {
get {
EnsureChildControls();
return base.Controls;
}
}

# re: Control Building and ViewState Redux 4/12/2005 3:22 PM Jesse Houwing

With regards to accessing the controls of a user control from the parent form.

This is ofcourse intended. A well-written control is more than a "template" of controls layed out on a panel. A well written control functions as one whole managing and restricting access to it's internal members. Any controls (or better yet, properties of controls) that need to be accessed directly from the page should be encapsulated using either a method or a property.

This is inconvenient at times, but it forces a better separation between a page and it's controls. It also prevents unwanted changing of internal variables that in some cases would need special treatment. This special treatment is then available by calling the correct property on the usercontrol.

# Has anyone had a problem with LoadViewStateFromPersistanceMedium() while using Dynamically added controls?? 5/1/2005 5:50 PM Shravan Addaypally

Hi,
I followed Scott's article Dynamic Web Controls, Postbacks and ViewState and codd my page accordingly in which I load a few hidden Textboxes depending upon the value returned from my DataAccessLayer. The hiddex boxes hold certain values that I am setting on the Client side to change the appearance of an Infragistics Grid, so for example, I set the header color value of one of the columns of the control, I also set that value into the corresponding hidden control so that on post back I read the value of the TextBox and set my header color from the value thats in the hidden textbox. All is well, until a certain period of time of which I'm not sure, a page post back causes the page to bump in into some wierd error, I've never came across before.
The exception details are as follows: System.FormatException: Input String was not in the corect format.

I'm not sure if this is because of any inconsistencies of the Infragistics WebGrid control that I'm using or is it because the way I programmed my dynamic addition of hidden textboxes. I know its very vague for any of you to even comment something on this but, I thought it wud be worth the try if someone had come across somethign like this before and would have a possible solution to this.

Thanks

# re: Control Building and ViewState Redux 7/3/2005 3:27 PM Sudeep

Hi Scott,
i read your articles and learned a lot from there. i am facing a problem that i hope you can pull me out.

here is the situation.
i have 2 buttons on my form.
clicking on one button is dynamically generating a textbox. that is fine. using your articles i am manage to set the properties of this textbox.
but the real problem is when i try to save the value of this textbox into a variable it at the button click of the second button the value in the textbox always show empty. i treid it a lot and tried to find a lot in the google. i even derived my own textbox to get the TrackViewState() method, but i can't get the value :((.
can u tell me a solution?

# re: Control Building and ViewState Redux 10/26/2005 12:40 PM Ali Zamurad

Hi Scott,
I have a user control which is dynamic in its nature. It basically consists of a html table having two rows. First row has a checkbox control and second row has a dyamic ASP table server control. The ASP table control will get different size depending upon the dataset passed in. When this user control displays on the web form it only show the checkbox, one checked it generates and display the dynamic table which carry a multiple labels and textboxes on in each row. When the checkbox on the control get unchecked this dynamic table goes away. The problem I am having to update and maintain the viewstate with the control itself but update its structure. Basically when the data changes in any textbox I fired an text_changed event. To make this event fired I had to make autopostback property true for the textbox otherwise the event does not get fired, I have tried different ways but not able to persists information for the second time around. I would appreciate anybody help.
I can even send the code if anybody would like to see.

# re: Control Building and ViewState Redux 11/16/2005 8:21 AM Brett Garnier

I am trying to build a paginated questionaire.
1 up to 10 possible "pages" with X number of controls on each page. All questions / possible responses are stored in a database.

I can render each "page" fine but have tried many ways of capturing the users' responses but not no avail.

Right now what I have is this.

10 tables set into the page. They are default to visible=false.

During OnInit I add the questions/answers to the correct Question table (Questions_1, Questions_2 etc)

When a user clicks a "continue" command button OnInit is fired again. The next appropriate table is populated and made visible.

Then the Click event fires. At this time I assume that I should be able to find the contents of the previous table (if i just built Questions_2 I would be looking for the contents of Questions_1).

My problem is that at this point in time Questions_1 has 0 rows and Questions_2 is fully populated.

I had initially just been using 1 table to do this, then tried using 1 panel with a dynamic number of tables being added, now I'm trying to make this work with a set number of tables dragged onto the page in design mode.

I'm down to the wire and would appreciate any advise. I'm getting frustrated because I would have had this done in minutes a couple years ago in classica asp by just iterating through request.form() so there HAS to be an answer.

Thanks!
bgarnier@inflexxion.com

# re: Control Building and ViewState Redux 1/16/2006 2:13 PM Feras

Hey Scott,

How can we dynamicaly add our own user controls(ascx files)to the page?

anyone ever done that?

# re: Control Building and ViewState Redux 1/16/2006 2:17 PM Scott Mitchell

Feras, you can most definitely dynamically add User Controls, use Page.LoadControl(path to user control).

# re: Control Building and ViewState Redux 1/17/2006 6:27 AM Feras

I tried Page.LoadControl(path to user control) , but it didnt work , i not sure y , maybe i didnt know how to handle it.

anyway heres another way that i found :

UserControl uc= (UserControl) LoadControl("UserControl Path"); PlaceHolder.Controls.Add(uc);

thanx for everthing Scott.

# Dropdownlist selected index doesnot get set 2/28/2006 7:29 AM DevGirl

Hi all,

I am adding usercontrols(containing a drop down list) I call Placeholder.Controls.Add in the init() stage and then set the properties in init() too.

So on each postback it gets added again. But if I postback by selecting the dropdownlist, it doesnt remember the selected index. i see that it goes thru the ddl_selectedIndexChanged and do what I want it to do. But dont remember the selected index

# re: Control Building and ViewState Redux 3/26/2006 12:18 PM Dejo

Hello Scott,
Has the rule of adding the control before setting properties changed with .Net 2.0? I tried as you suggested and my user control (a gridview with some textboxes at the bottom) does not display at all, but it does display if I add it (to a placeholder) after setting the properties. That really is not my problem as it works. What fails is getting sorting to work. I click on a header and it fails. the gridview disappears. All over the web, the recommendaton is capture the event and I haven't the foggiest idea how.

# re: Control Building and ViewState Redux 3/26/2006 5:00 PM Robert

Scott,

Thanks for publishing these articles on view state -- they're very helpful. I've discovered
another nuance to view state and dynamic controls, though, that I'd like to share.

It turns out that even though view state is LOADED after the Init procedure, it doesn't get
firmly associated with the objects on the page until it's actually SAVED. (And as you've
noted, that happens after all the event procedures have fired.) So even if you recreate in
your Init procedure all the controls from the previous instance of your page, you STILL can't
insert or remove objects from the page without totally messing the view states. I had hoped
that you could recreate the objects, have them associated with the view state, and then have
changes to the objects reflected automatically in the view states. But no.

You mentioned this view state shifting in your MSDN article, but as far as I can tell,
there's no way around it if you're relying on the View State at all. For this project, I've
just decided to track state myself via custom hidden fields.

- Robert

# re: Control Building and ViewState Redux 4/24/2006 4:14 PM David

Hi

I am using asp.net 2.0 and adding user controls dynamically to a page. Have things changed in .net 2.0? I have read all your posts and none of the ideas are working for me.

We are creating usercontrols in a class library project, the user controls are then loaded into a web application and added dynamically to a page. Viewstate seems to be lost completely for the dynamically loaded user controls.

Any ideas?

David

# re: Control Building and ViewState Redux 5/9/2006 9:47 PM Dave Reed

If you ask me its better to set the control properties and THEN add it to the control collection. You're going to be setting the value again on the next request anyway, why on earth do you want it persisted into the viewstate hidden form field too? ASP.NET itself sets control properties before adding controls to the collection. When you declare a label text="<some really really really long string>", do you think you see that string encoded in the viewstate form field? Nope. It's not supposed to.

You said "So binding the items to the DropDownList prior to adding the DropDownList to the Controls collection causes those additions to not be saved in the view state for the DropDownList." Well -- why do you want the items to be persisted in viewstate when you can just bind them every request? You'll have a smaller viewstate footprint as a result. If getting the items is an expensive operation then I can see the reason. But this whole thing goes into the "bloating viewstate" category in my mind, which I describe in detail in my blog entry titled "truly understanding viewstate". :)


http://infinitiesloop.blogspot.com

# Dynamically Loading Controls in ASP.NET Is A Pain 7/19/2006 7:44 PM K. Scott Allen

Q: I'm using LoadControl to dynamically place objects into my web form. I've struggled with missing events...

# re: Control Building and ViewState Redux 9/7/2006 5:12 AM Xavier

First thank you to all of you, who are sharing your experience on this blog. Concerning the stage of the life cycle of the page, at which we should add dynamic controls, it seems to be clear that we should do it in OnInit(). This subject has been dealed with above and we saw the problem of adding them at this stage, if the dynamic controls depend of some state of the page.
In the framework 2.0 Microsoft has introduced a new concept: The ControlState with the two functions LoadControlState() / SaveControlState(). At first I thought, it was the solution and I thought, those function would give us the possibility of having the state earlier within the OnInit() stage. I was very disappointed as I tested it, and realized that we do not have the state before OnLoad(), that is the same as if we were saving the state in the ViewState. So I don't really understand the purpose of SaveControlState() / LoadControlState().

In order to add child controls in OnInit() the only solution seems to be persisting the state in self added hidden fields. We can then get their values in OnInit() from the Request object.

# re: Control Building and ViewState Redux 11/15/2006 10:27 PM Ruben Cordoba

Nice article. Thank you for sharing your knowledge about dynamic controls and viewstate.

I would like to comment one of my problems working with viewstate:

In a page derived from a master page, a GridView control populates a list of animals. Only for the first animal (row) in the populated list, a dynamic user control is loaded. The code is as follows:

Animal.aspx

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="AnimalID" EnableViewState="False">

<Columns>

<asp:TemplateField>

<ItemTemplate>

<asp:PlaceHolder ID="PlaceHolder1" runat="server" />

</ItemTemplate>

</asp:TemplateField>

</Columns>

</asp:GridView>

</asp:Content>

Note that the dynamic user control is re-created on every post back:

Animal.aspx.vb

Protected Sub Page_Load(...)

GridView1.DataSource = ListAnimals()

GridView1.DataBind()

End Sub

Protected Sub GridView1_RowDataBound(...)

...

If e.Row.RowIndex = 0 Then

Dim Control As Control = Nothing

Control = Page.LoadControl("AnimalPictures.ascx")

Control.ID = "AnimalPictures1"

CType(Control.FindControl("AnimalID"), HiddenField).Value = CType(DataBinder.Eval(e.Row.DataItem, "AnimalID"), Integer)

CType(e.Row.FindControl("PlaceHolder1"), PlaceHolder).Controls.Clear()

CType(e.Row.FindControl("PlaceHolder1"), PlaceHolder).Controls.Add(Control)

End If

...

End Sub

The dynamic user control contains a DataList which populates 4 random pictures about a particular animal. EnableViewState = True is used for the dynamic user control:

AnimalPictures.ascx

<%@ Control Language="VB" ... EnableViewState="True" %>

<asp:DataList ID="DataList1" runat="server" RepeatDirection="Horizontal">

<ItemTemplate>

<asp:LinkButton ID="LinkButton1" runat="server" CommandName="LinkButton1" CommandArgument='<%# Eval("PictureID") %>' PostBackUrl="~/PictureDetails.aspx">

<asp:Image ID="Image1" runat="server" />

</asp:LinkButton>

</ItemTemplate>

</asp:DataList>

<asp:HiddenField ID="AnimalID" runat="server" />

Only the first time the dynamic user control is loaded, a database call is required to retrieve the 4 random pictures.

AnimalPictures.ascx.vb

Protected Sub Page_Load(...)

If Not Page.IsPostBack Then

DataList1.DataSource = RandomAnimalPictures(AnimalID.Value)

DataList1.DataBind()

End If

End Sub

Protected Sub DataList1_ItemCommand(...)

...

End Sub

Protected Sub DataList1_ItemDataBound(...)

...

End Sub

1. When I execute the code and click on one of the animal pictures, the DataList1_ItemCommand event handler is not fired, so I cannot get the details page about that particular animal picture.

2. If I remove the line If Not Page.IsPostBack... from AnimalPictures.ascx.vb the DataList1_ItemCommand event handler is fired. However, because a new database called is executed to retrieve 4 new random images about that particular animal, when I get to the PictureDetails.aspx page, the details information page doesn’t coincide with the picture I clicked on.

What am I doing wrong? Why is the DataList1_ItemCommand event handler not fired? I hope I explained my problem with enough details.

Thanks

# Dynamic controls, postbacks, and view state | keyongtech 1/18/2009 8:10 AM Pingback/TrackBack

Dynamic controls, postbacks, and view state | keyongtech

Title:  
Name:  
Url:
Protected by Clearscreen.SharpHIPEnter the code you see:
Comments   

My Links

Ads Via DevMavens

Archives

Post Categories

 

I am a Microsoft MVP for ASP.NET.
I am an ASPInsider.
<July 2009>
SMTWTFS
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

Comment Stats

DayTotal% of Total
Sunday 2046.9%
Monday 42314.3%
Tuesday 50116.9%
Wednesday 54518.4%
Thursday 57219.3%
Friday 53618.1%
Saturday 1856.2%
Total 2966100.0%

Hour1Total% of Total
12:00 AM 752.5%
1:00 AM 802.7%
2:00 AM 672.3%
3:00 AM 812.7%
4:00 AM 642.2%
5:00 AM 1234.1%
6:00 AM 1153.9%
7:00 AM 1755.9%
8:00 AM 1876.3%
9:00 AM 1565.3%
10:00 AM 1866.3%
11:00 AM 1926.5%
12:00 PM 1996.7%
1:00 PM 1846.2%
2:00 PM 1675.6%
3:00 PM 1344.5%
4:00 PM 1153.9%
5:00 PM 1063.6%
6:00 PM 993.3%
7:00 PM 1063.6%
8:00 PM 903.0%
9:00 PM 842.8%
10:00 PM 893.0%
11:00 PM 923.1%
Total 2966100.0%

Comments by Blog Entry Date/Time

Day Entry MadeAvg.Total
Sunday 4.91157
Monday 4.92379
Tuesday 4.21471
Wednesday 7.42668
Thursday 6.53666
Friday 5.17450
Saturday 4.73175
Total 5.522966

Hour1 Entry MadeAvg.Total
12:00 AM 5.2937
1:00 AM 1.002
5:00 AM 0.000
7:00 AM 4.0048
8:00 AM 4.29133
9:00 AM 6.04290
10:00 AM 5.83274
11:00 AM 4.36192
12:00 PM 6.44348
1:00 PM 3.14132
2:00 PM 5.04227
3:00 PM 7.97303
4:00 PM 3.8199
5:00 PM 6.00168
6:00 PM 4.56114
7:00 PM 8.95188
8:00 PM 8.58163
9:00 PM 5.00115
10:00 PM 6.31101
11:00 PM 4.5732
Total 5.522966

Learn More About Comment Stats
1 - All times GMT -8...


Blog Stats

Favorite Web Sites

My Books

My MSDN Articles