Recently I decided to make a prototype of a DotNetNuke module project that achieved these goals:
- A database application that gathers data
- Each record can have an unlimited number of forms used for processing the same record
- Each form can share values with other forms
After prototyping different designs, this is the design I decided on:
Dynamic Forms
I do not recommend using dynamic forms for providing module navigation. See Module Navigation Options for alternative methods. However, for this application I needed to create an unlimited amount of forms so dynamically loading the forms into a content placeholder was a perfect fit.
Dynamically Loaded Controls Do Not Save Viewstate!
When you load a ASP.NET control dynamically and then click the submit button on the main page (causing a postback), the dynamically loaded control disappears and you lose all the information! As you can imagine, discovering this 2 days into the prototype makes you glad you decided to make the prototype because you are now forced to come up with a different game plan.
Enter Denis Bauer
Denis Bauer has created a Dynamic Placeholder that maintains the viewstate of dynamically loaded controls. He also provides the source. Without this code this module simply would not work.
Implementation
The module uses the following database schema. Two different tables hold the data collected by the forms. The DynamicForms_RecordData_Large is used to hold the large text data. Any Textbox control that has multiple rows will have it's data stored in this table. All other controls store their data in DynamicForms_RecordData.
You can open any of the controls in the DynamicControls folder and add or remove the standard form controls. The program will automatically gather and store the information with no other modification needed. If you desire for the forms to display the same data, simply give the controls the same ID name.
The drop-down in the example uses a database lookup to generate the list of Modules. This database lookup is placed in the Page_Init of the control in order to work properly.
The module also uses the DAL+. This provided for very rapid module development. The dynamic queries could easily be converted to stored procedures if that is desired. The paging method uses the ROW_NUMBER() function that is only available in SQL Server 2005. For this reason the module will only work with SQL Server 2005. This paging method allows the module to page through large sets of data efficiently.
Here is the code (you can also Download the code at this link):
- App_Code/DynamicForms
- Bin
- DesktopModules/DynamicForms
Note:
- Due to the use of ROW_NUMBER() OVER(ORDER BY RecordID) AS RowNumber in the DAL code, this module will only work with SQL Server 2005 and SQL Server 2005 express. It will not work on SQL Server 2000
- This is only a prototype so this code has not been properly tested. Therefore this code is not meant to be used in production. It is only meant to be used as a programming example.
Download the code at this link