To actually answer your quesiton, as much as everyone else seems to not want you to do this, and I agree...I have done this sort of thing before.
The first thing I'd do is make your page implement an interface.
In the control:
IVansFannelDataProviderPage provider = this.Page as IVansFannelDataProviderPage;
if (provider != null) { //grab data from interface } else throw YouCantPutThisControlOnThisKindOfPageException();
It's not the most elegant way to do it, but when we had a lot of controls wanting to share a very expensive object this fit the bill.
This works well, but it makes your control unusable on pages that don't implement the interface--and that makes the controls too tightly coupled to your page. Everyone else saying to have the page get data from the controls is correct; you put controls on the page, not pages in controls.
You should have a very good reason in order to do it. For us: the load of the shared object was very expensive, and having the page load/save it no matter what control was working on that object was quite useful.
It was too bad that a lot of pages that didn't really implement the interface had to be shoehorned to provide some sort of support or proxy support just to get the controls to work, and made the pages and controls that much less reusable.
If I had to do this over again, I'd have the page send data to the controls with events, probably through reflection if I needed to be lazy.