Introducción

Tomando como base las diferentes propuestas presentadas por Ken Walker, Mike Dolan y Scott Michell, en la que la mayoría de estas y otras soluciones ocurre que cuando existen columnas tipo BoundColumn o TemplateColumn que contienen controles tipo Button, LinkButton, CheckBox o Controles Web que necesitan ser puestos dentro de un formulario del lado del servidor, aquellos que pueden provocar un PostBack, mandan un error que dice: "Control ControlID" del Tipo ‘TipoControl" debe estar dentro de un etiqueta form con el atributo runat=server, esto sucede porque el método RenderControl() aplicado al DataGrid (utilizado en la mayoría de las propuestas vistas) invoca recursivamente el mismo método pero de cada control visible que existe en el DataGrid. Este método invoca a otro método que es el Page.VerifyRenderingInServerForm(), la función de éste último es que verifica que un control es generado después de que el formulario del lado del servidor ha empezado ha generarse, pero antes de que éste termine de generarse.

Demostración del Control

El control está escrito en C#, cumple con las especificaciones del CLS, la idea de este control es que pueda ser invocado desde cualquier parte de una aplicación web, solucionando los problemas antes descritos (el tener controles tipo Button, CheckBox, etc).

Para la demostración se creará una Aplicación Web en vb.net, utilizando como herramientas el Visual Studio.Net 2003 y WebMatrix

Creación de una nueva Aplicación Web

Empezando con el diseño de la página, se separan 2 secciones de la página a traves de CSS, en el lado izquierdo se usa CSS para dar el formato al DataGrid, para el lado derecho se usó el "Formato Automático"; se procurará para este ejemplo tener un documento XHTML válido, para lo cuál se borra todo el contenido generado por el Visual Studio.net 2003, el cuál lamentablemente no permite desarrollar documentos XHTML válidos, es por esa razón del uso de WebMatrix para el proyecto, por otro lado el Visual Studio 2005 (Whidbey) si soporta esta característica.

Vista de la página

Se pone el código necesario para acceder a la base de datos y dar la funcionalidad a la paginación del DataGrid

Private Sub CargarDatos(Byval queDataGrid As dgDatos)
	' Define el DataSet
	Dim ds As DataSet
	' Si el dataset ya está en el ViewState
	' entonces recuperarlo de ahí, para no tener que acceder a la base de datos
	' consecutivamente
	If ViewState("datos") Is Nothing Then
		ds = New DataSet
		Dim da As New SqlDataAdapter("select * from customers", strConexion)
		da.Fill(ds, "Clientes")
		ViewState("datos") = ds
	Else
		ds = CType(ViewState("datos"), DataSet)
	End If
	' Hace el binding para el DataGrid seleccionado
	Select Case queDatagrid
		Case dgDatos.ConCSS
			dgConCSS.DataSource = ds
			dgConCSS.DataBind()
		Case dgDatos.SinCSS
			dgSinCSS.DataSource = ds
			dgSinCSS.DataBind()
		Case Else
			dgConCSS.DataSource = ds
			dgConCSS.DataBind()
			dgSinCSS.DataSource = ds
			dgSinCSS.DataBind()
	End Select
End Sub

Según se puede observar en el código, se asigna a través de código la clase CSS que dá el "formato" a cada parte de dgConCSS, por otro lado se utiliza el método CargarDatos para hacer el DataBinding del DataGrid que hace el PostBack (a través de la paginación).

El control se puede agregar a la barra de herramientas tanto del Visual Studio.Net o del WebMatrix, pudiendo modificar algunas de sus propiedades en tiempo de diseño, también puede crearse dinámicamente a través de código.

Propiedades del Control en tiempo de Diseño

Finalmente se asignan las propiedades necesarias para el funcionamiento del control y se puede ver los resultados en las siguientes figuras:

DataGrid con CSS exportado a ExcelDataGrid sin CSS exportado a Excel

Se puede observar que se pasó sin ningún error los controles de tipo Button y CheckBox respectivamente.

Elementos Utilizados

Autor

Alexander Concha Abarca
Instructor 3ra Estrella - VB.NET

xknown at hotmail.com