Date un'occhiata al Dynamic Data.
Recentemente l'ho scoperto e mi è già stato salvato un lotto di tempo.
Aggiornamento:
Scuse - dopo aver riletto la questione, non credo che questo è quello che cercavamo.
Se si desidera generare dinamicamente il modulo in base ai record nel database, potrebbe essere necessario scrivere il proprio motore.
Un paio di suggerimenti però:
- mi piacerebbe guardare utilizzando la riflessione di caricare i controlli, piuttosto che grandi dichiarazioni caso. In questo modo è possibile aggiungere in modo dinamico diversi tipi di controllo semplicemente includendo il nuovo assembly. Non dovresti scrivere un nuovo codice.
- Assicurarsi di includere un modo per controllare l'ordine di visualizzazione nel database. Prendo atto che si desidera utilizzare una tabella diversa per ciascun pannello di controlli. Lo sconsiglio a causa del problema con l'ordine di visualizzazione. Se hai una tabella con un elenco di pannelli e una tabella con un elenco di elementi di dati + riferimenti a chiavi esterne ai pannelli, sarai in grado di ordinarli in modo prevedibile e controllabile sulla pagina.
Update: più informazioni riflessione
In parole povere, la riflessione è quando si scopre sui dettagli di un assembly in fase di esecuzione. In questo caso, suggerisco di utilizzare reflection per caricare un controllo in base alle informazioni nel database.
Quindi, se si ha un record nel database simile al seguente:
FieldName DataType DisplayControl DisplayProperty
----------------------------------------------------------------------------------
FirstName System.String System.Web.UI.WebControls.TextBox Text
si potrebbe usare un po 'di codice come il seguente per generare il controllo della pagina (si noti che è non testato):
// after getting the "PageItem" database records into a "pageItems" array
foreach (PageItem p in pageItems)
{
// get the type and properties
Type controlType = System.Type.GetType(p.DisplayControl)
PropertyInfo[] controlPropertiesArray = controlType.GetProperties();
// create the object
object control = Activator.CreateInstance(controlType);
// look for matching property
foreach (PropertyInfo controlProperty in controlPropertiesArray)
{
if (controlPropertiesArray.Name == p.DisplayProperty)
{
// set the Control's property
controlProperty.SetValue(control, "data for this item", null);
}
}
// then generate the control on the page using LoadControl (sorry, lacking time to look that up)
C'è una pagina veramente buona che descrive come fare questo here. Sembra essere più o meno quello che stai cercando.
Non ho familiarità con la riflessione, puoi espandere ciò che volevi dire? Preferibilmente con un semplice esempio? – Joshscorp
Certo, aggiornerò la mia risposta – Damovisa
Grazie, mi dà un po 'di vantaggio, pensi che sarò in grado di utilizzare i controlli Telerik con Activator.CreateInstance? – Joshscorp