Pregunta

Estoy creando una aplicación ASP.NET en el que el administrador del programa será capaz de definir campos personalizados para los formularios que los usuarios van a llenar y enviar.

El administrador tiene que definir varios tipos de campos como casillas de verificación, botones de radio, cuadros de texto y áreas de texto para que el usuario rellene. El administrador también puede definir si se debería exigir estos campos personalizados.

Estoy en las etapas de planificación y ahora estoy preguntando acerca de cómo pueda almacenar estas definiciones de campos personalizados en la base de datos y cómo voy a hacerlos salir y hacer que la función.

Editar

los datos del formulario que se presenta por los usuarios finales con estos campos de formularios creados dinámicamente también ha de ser persistido en la base de datos.

¿Cómo puedo solucionar este problema?

¿Fue útil?

Solución

Sin haber hecho esto o realmente nada igual, yo creo que la estructura de su base de datos podría incluir el tipo de control, su nombre, su tipo de valor, si es validado, cómo su validada, si es necesario. Entonces, como usted está leyendo a través de los registros / conjunto de datos de controles deseados, es probable que comparar el tipo de control en el conjunto de registros con el valor traducido y luego añadirlo al formulario web.

Por ejemplo:

if(drow["ControlType"].ToString().ToUpper() == "TEXTBOX")
{
    Label lbl = new Label();
    lbl.Text = drow["ControlLabel"].ToString();
    TextBox txt = new TextBox();

    //TO GET THE VALUE ON POSTBACK LATER
    txt.ID = drow["ControlID"].ToString();

    //PROBABLY NOT NECESSARY
    Div myDiv = new Div();
    myDiv.Controls.Add(lbl);
    myDiv.Controls.Add(txt);

    //ADD THE DIV ABOVE TO THE FORM/PANEL/DIV/ETC.
    MyForm.Controls.Add(myDiv);
}

Esto, en teoría, sería poner la etiqueta junto al control de cuadro de texto. No tengo ni idea de si el Div iba a funcionar, pero se puede ejecutar a través de este tipo de cosas para CheckBox, TextBox, Label, etc.

Una vez que los controles y las etiquetas están en la página, usted querrá algún tipo de acción para hacer que el servidor para guardar los valores de una base de datos. Me gustaría recomendar que almacena el nombre de tabla y columna con la lista de objetos. A continuación, asignar el campo de formulario a una columna DB para el inserto. (Tenga en cuenta esta explicación es como en 200.000 pies)

Otros consejos

Aquí es algo que he batida bien rápido para la prueba de concepto.

DynamicForms.zip

he construido en VS 2008 SP1. Existe una base de datos de SQL Server en la carpeta de datos de programa, por lo sqlexpress ayudará si desea ejecutar este.

he construido esto rápidamente, así que es bastante descuidado.

Sería necesaria la siguiente estructura básica: Formulario, Campo, FieldType. Tendrá que los objetos de negocio y tablas de datos para cada uno para que pueda almacenar las configuraciones para cada campo.

Es probable que necesita el campo para tener varias propiedades que se pueden establecer (como se requiera) para que pueda realizar un seguimiento de esta forma independiente para cada campo.

A continuación, tendrá algún tipo de utilidad que puede leer la capa de datos, y luego para cada campo y el campo de tipo de saber qué tipo de control para hacer, y cómo agregar los controles a la página actual.

El uso de un asp: Etiqueta PlaceHolder en la página principal le permitirá agregar dinámicamente controles a este marcador de posición usando su utilidad forma del edificio

.

Por último, es probable que quiera construir una hoja de estilo con varias clases de diferentes partes de la forma que se generan de manera que el cliente puede personalizar las fuentes, espaciado, etc., de cualquier mesa de controles que generan.

EDIT:

Si los datos introducidos en el formulario es necesario que haya persistido, a continuación, tiene que decidir si quiere tener una capa de datos personalizable. Usted puede tener una tabla de base de datos vacía que utiliza secuencias de comandos ALTER TABLE en permitir que el cliente para añadir columnas a la base de datos según sea necesario, y entonces se puede establecer que el control se une a la que la columna. Este mapeo entre el control a la columna de base de datos será crucial para almacenar los datos correctamente.

Todos los controles se pueden crear instancias y se añade a la página.    Ejemplo:

 Label label = new Label();
 CheckBox check = new CheckBox();

Después de que usted debe agregar el control a la propiedad Controls de cualquier contenedor:

Panel1.Controls.Add(label);

Para recuperar el control después de una devolución de datos se puede utilizar el método FindControl.

TextBox name = (TextBox) Panel1.FindControl("name of control");

Como otros han dicho, hay maneras de hacer esto definately añadiendo dinámicamente controles para una página ASP.NET en tiempo de ejecución.

Por otra parte, a pesar de que no he usado Microsoft InfoPath , de lo he oído hablar de él, lo hace mucho de lo que está tratando de hacer (es decir, permiten super-usuarios diseñar formularios / cuestionarios y poner en la web y se reúnen los datos de nuevo en la tarde)

Si su cliente tiene la edición de Microsoft Office correspondiente, puede ser que tengan ya InfoPath.

He trabajado en esto antes. He utilizado dos mesas para esto, digamos

KeyField_Master:? Por nombre, el tipo, y es obligatorio o no

y

KeyField_Details:. Para almacenar campos personalizados en términos de valor (valor y descripción)

Uso Load evento para crear que los campos

if (keyField_type == "T") // Textbox
{
   txtBox.Attributes.Add("Type", "T"); // type of field for validation
   txtBox.Attributes.Add("IsKeyField", "Y"); // to mark it as a custom field
   if (isMandatory == "Y")
     txtBox.Attributes.Add("IsMandatory", "Y"); // is it mandatory

   // you could set layout of these controls using HTML Tables or any other way you prefer.

  htmlCell.Controls.Add(txtBox);
  htmlRow.Cells.Add(htmlCell);
  tbHTML.Rows.Insert(2, htmlRow);
}
else if // other controls type
{
  // ...
}

Además, se puede hacer referencia a esa pregunta "Cómo validar los controles creados de forma dinámica?" Esta pregunta está relacionada con este procedimiento?

Además, la validación podría ser del lado del cliente como se describe en la pregunta anterior? o del lado del servidor mediante el almacenamiento de los campos creados en una lista entonces se podría comprobar que la lista en tiempo de enviar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top