Master Page DataBind() will clear data on your page – remember!
I was working on a problem with a drop down list getting un-initialized and had run across this page:
This simple post is about a coder who was getting their ddl control reset every time a postback occurred. They had not yet learned about putting the initialization inside an if statement that only runs when the page is first loaded.
I had done this, and had not changed the code on this page for days and yet it stopped working.
Then I realized — I had been fighting with the links on the site.master.cs page that were causing the link to come up blank. I learned that when you have a reference in your head element on the master page like so:
You need this:
Page.DataBind(); // (yes, but not quite…)
in your Page_Load so that the function call will be resolved. I added that line and my links all started working — and my drop down list started clearing on a postback. But there were enough hours between these discoveries, that I hadn’t made the connection.
What I really needed was:
if (! Page.IsPostBack) // (better, but not yet done…)
since the DataBind affects all of the data bound controls on all of the pages that use it as a master page.
But wait, there’s more!
I thought this had cleared up my issue, but then I found that another control that I initialized lost its value. It turns out that this DataBind on the entire page is not a good idea. Instead you need to be specific about the stuff on the master page. So I did this:
if (! Page.IsPostBack)
Page.Header.DataBind(); // initializes the script references
LoginView1.DataBind(); // initializes a link inside LoginView1
Ok, I think that does it. I feel better about a more qualified / constrained approach too.
With this qualification, I got the initialization on the links I needed, and didn’t interfere with the drop down lists that were initialized once and then needed to remain populated. I didn’t find this anywhere, and so I am hoping that it will save someone the couple hours I spent.