Parece un candidato potencial para una solución de InfoPath. A primera vista, hará la mayoría/todo lo que está pidiendo.
Este artículo ofrece una breve descripción general de la creación de un formulario de InfoPath que se basa en una fuente de datos SQL.
http://office.microsoft.com/en-us/infopath-help/design-a-form-template-based-on-a-microsoft-sql-server-database-HP010086639.aspx
he construido una solución completamente personalizada como usted está describiendo, y si alguna vez lo hizo de nuevo, probablemente optar por cualquiera de 1) un producto de terceros o 2) menos funcionalidad. Puede dedicar el 90% de su tiempo a trabajar en un 10% del conjunto de funciones.
EDIT: vuelva a leer sus preguntas y aquí hay comentarios adicionales.
1 - Estructura de datos flexible: Un par de cosas a tener en cuenta son el rendimiento y la capacidad de escribir informes con los datos. Cuanto más genérica sea la estructura de datos, más difícil será lograrlo (nuevamente, hablando desde la experiencia).
De forma contraria al rendimiento y la preparación de informes, Microsoft SharePoint usa fragmentos/documentos XML en tablas genéricas para una máxima flexibilidad. No puedo discutir las características de SharePoint, por lo que hace el trabajo y simplifica enormemente la estructura de datos. XML funcionará bien cuando se realice correctamente, pero a la mayoría de las personas les resultará más difícil escribir consultas en XML. Aunque XML es un "ciudadano de primera clase" para SQL Server, puede funcionar o no tan bien como una estructura de tabla optimizada.
2 - Formas: Implementé formularios personalizados utilizando XML transformado por XSLT. XML es a menudo una buena opción para almacenar la estructura del formulario; XSLT es un monstruo en sí mismo, pero es muy potente. Por lo que vale, InfoPath almacena su estructura de formulario como XML.
También he implementado formularios dinámicos usando controles personalizados en .Net. Este es un enfoque orientado a objetos, pero (dependiendo de la complejidad de la interfaz de usuario) puede requerir una cantidad significativa de código.
Por último (otra vez usando SharePoint como ejemplo), Microsoft implementó definiciones extremadamente complicadas de listas/formularios XML en SharePoint 2007. La complejidad derrota a muchos de los beneficios. En otras palabras, si va por la ruta XML, haga que sus estructuras sean simples y limpias o tendrá una pesadilla de mantenimiento en sus manos.
EDIT # 2: En referencia a la pregunta de Scott a continuación, aquí hay una estructura de datos de alto nivel que evitará la duplicación de datos y no confía en XML para la mayoría de la definición de formulario.
Advertencia: Acabo de poner este diseño en SQL Management Studio ... Solo pasé 10 minutos en él; desarrollar un sistema de formulario flexible no es una tarea trivial, por lo que se trata de una simplificación excesiva. No aborda el almacenamiento de los datos ingresados por el usuario, solo la definición del formulario.
Las tablas:
Form - Clasificación de la forma de nivel superior que contiene (como era de adivinar) el conjunto de campos que componen el formulario.
Campo: campos genéricos que pueden reutilizarse en todos los formularios. Por ejemplo, no desea 50 campos diferentes de "Apellido" para 50 formularios diferentes. Tenga en cuenta la columna "DataTypeId". Puede almacenar cualquier tipo que desee en esta columna, como "número", texto libre ", incluso un valor que indique que el usuario debe elegir de una lista.
FormField - permite que un formulario contenga 0-muchos campos en su definición. Incluso podría extender esta tabla para indicar que el usuario puede AGREGAR tantos de este campo como lo necesite.
Restricción: básicamente una tabla de búsqueda que define un tipo de restricción (tal vez su longitud máxima, ocurrencias máximas, requeridas, etc.)
FormFieldConstraint: relaciona una restricción con una instancia particular de un campo de formulario. Esta tabla combina un formulario específico con un campo específico con una restricción específica. Tenga en cuenta la columna de metadatos norte; esto podría ser un buen uso para XML para almacenar los detalles de la restricción.
Esencialmente, sugiero construir una base de datos normalizada con pocos o ningún valor nulo y sin datos duplicados. Una estructura como la que describí te llevaría al camino hacia ese objetivo.
Gracias por la respuesta. 1) Estaría nervioso de almacenar todos los datos en xml. En cuanto a la estructura de datos genéricos, ¿cuál de las dos opciones (a y b) que enumeré sería más difícil? Siento que b sería la solución más fácil. ¿De acuerdo? 2) Me gusta la idea de XML (limpio) cada vez mejor para el formulario, tendré que buscar en XSLT, no sé mucho al respecto. Tengo curiosidad por saber cómo creó los controles personalizados en .Net. Estaba pensando en crear controles de usuario (uno para el cuadro de texto, menú desplegable, etc.), pero ¿cómo se crea el enlace para leer/escribir en el db? – scojomodena
@Scott J: mira mi publicación actualizada. Publiqué un ejemplo que debería eliminar la duplicación que mencionas en la opción B. En cuanto a los controles personalizados ... los controles del usuario también funcionarían bien, a menos que necesites compartirlos en los ensamblados. Cada control probablemente debería implementar una interfaz común que les permita completar datos y obtener datos de ellos. Estos controles se colocarían en una página principal/control que entendiera cómo agregar datos de ellos y pasarlos al nivel comercial. –