 <p>There are several problems you need to address — both in your code and both in your current knowledge :-) Start with this:</p> <ol> <li><p>Read a few articles about ASP.NET's page life-cycle, so you become more familiar with what to do in each life-cycle event handler (<code>OnInit</code>, <code>OnLoad</code>, …). Good starting point might be this <a href="http://msdn.microsoft.com/en-us/library/ms178472.aspx" rel="nofollow">MSDN overview</a>. However, google for “ASP.NET page life cycle” and read a few other articles and examples as well.</p> <p>Also, you will need to get familiar with the request-response nature of ASP.NET page processing. In the beginning, bear in mind that when the user hits some 'Submit' button which in turn causes an HTTP POST request to occur, you are responsible to creating the page's control tree to match its structure, IDs, etc. as they were in the previous request. Otherwise ASP.NET doesn't know how in which controls to bind the data the user filled-in.</p></li> <li><p>Near the line tagged <code>//Lost and confused here :/</code> you are creating a new control and immediately querying it for the 'results' (which I expect to be values of some edit boxes within it). This cannot work, because it's most probably too early for the form to have the data received from the <code>Page</code> object that drives the request processing.</p></li> <li><p>Your <code>Results</code> property is poorly designed. First, you shouldn't be using properties that actually 'generate' data in such a way they can change without notice. Properties shall be used as “smart fields”, otherwise you end up with less manageable and less readable code. Second, the setter you left there like “set;” causes any value assigned into the property to be actually lost, because there's no way to retrieve it. While in some rare cases this behavior may be intentional, in your case I guess it's just an error.</p></li> </ol> <p>So, while you can currently leave behind any “good OOP way” to approach your problem, you certainly should get more familiar with the page life-cycle. Understanding it really requires some thinking about the principles how ASP.NET web applications are supposed to work, but I'm sure it will provide you with the kick forward you actually need.</p> <p><strong>UPDATE:</strong> In respect to Tony's code (see comments) the following shall be done to move the code forward:</p> <ol> <li><p>The list of form data in the <code>requestForm</code> property shall have tuple of [form ASCX path, control ID, the actual <code>RequestForm</code> data class]</p></li> <li><p><code>GatherForms</code> shall be called only when the page is initially loaded (i.e. <code>if (Page.IsPostBack)</code>) and it shall fill <code>requestForm</code> with the respective tuples for available ASCX forms.</p></li> <li><p>Both <code>chklApplications</code> and wizard steps shall be created in <code>LoadForms</code> on the basis of <code>requestForm</code>'s content.</p></li> <li><p>When results are to be gathered, the ID stored in the respective <code>requestForm</code> entry can be used to look-up the actual user control.</p></li> </ol>