Repeaters and Lost Data After Postback (Viewstate) October 8, 2009
Posted by codinglifestyle in ASP.NET, CodeProject.Tags: postback, repeater, viewstate
trackback
Test question: I have a form which binds data to a Repeater on PageLoad. The Repeater’s ItemTemplate contains a TextBox and Checkbox. On postback the data is lost. What’s wrong?
You may have found this page if you have been googling the following:
- repeater postback lost data
- dynamic control postback viewstate
- data lost on postback
The problem is the Repeater is a dynamic control. If you are binding in the codebehind, which we typically are, you have to realize that the textbox and checkboxes do not existuntil you DataBind(). Keeping that in mind, we should ask ourselves what is the order of execution of ViewState. I think we can start to formulate our answer to the question above by realizing where I DataBind() and create my controls in relation to the workings of ViewState is why our data is lost on postback.
So, the answer: PageLoad is the wrong place to bind a Repeater or setup a dynamic control. It is too late. ViewState has already tried to resync your controls but they weren’t created yet.
What about the answer you want? Stop toying with me and tell me the answer I hear you say. Try OnInit(). If you bind there you’re controls will exist in time for ViewState to operate normally.
protected override void OnInit(EventArgs e)
I would have also accepted Repeaters are the evil frogspawn of Satan and should never be used unless you find peeling off your fingernails with rusty pliers appealing.
ref: http://weblogs.asp.net/ngur/archive/2004/05/17/133340.aspx, http://aspnet.4guysfromrolla.com/articles/092904-1.aspx
You saved my day. Thanks a lot!
THANK YOU!!!!! This was driving me crazy. I was trying to add all kinds of session code to figure out why the repeater databind wasn’t working on the page load after a postback occurred.
Thanks!
Oh my god. This is just unvalueable information. So many incorrect suggestions you get if you google on this, but your info was spot on!
Thanks a bunch!!!
// Regards, Torbjörn
Thank you! This absolutely consumed my day yesterday. I found your post at 4:50 and actually felt like I accomplished something by 5:00.
Thanks a lot friend!! You save my work!
thanks!
Thank you so much, I lost way too much time with code examples that didn’t point this out.
Thanks very much!!!:) A simple explanation!:) You save my job!:) Thanks!! From Portugal with Love:)
Same thing for me… It works perfectly ! I can now go to bed…
you saved my life ! atesbaris
thanks! in my case onInit() didn’t do the job however you have pointed me in the right direction and I realized that the code should be in OnDataBinding
protected override void OnDataBinding(EventArgs e)
{
base.OnDataBinding(e);
//My Code goes here
}
(data binding for a control in a repeater)
Thanks .. It was really helpful… I was struggling to retain the values
Spot on, thanks a lot for the info!
thanku so much… i lost so much of time looking was answers else where…
Thanks 🙂 And why are repeaters the evil frogspawn of Satan?
Due to their dynamic nature, they add an extra layer of complexity when dealing with custom controls. A good understanding of the ASP.NET Page Lifecycle is required to get everything working in practice.
This worked perfectly in my solution:
However:
If you have a call to
DataBind()
in your page’sPage_Load
method, the user-entered values (e.g. in a TextBox inside the repeater) were lost.So it was important in my case to not call
DataBind
.Thanks a lot