tolotoco |
Martes 01 de abril de 2008 a las 04:41:29
Vamos a ver cómo se añade una columna con un botón o un checkbox en un Datagrid.
Para poder hacerlo hay que crear las columnas del Datagrid en tiempo de ejecución, por lo tanto, la propiedad [b]AutoGenerateColumns[/b] del Datagrid debe estar en [b]False[/b].
Lo primero de todo es recuperar los datos que queremos mostrar. Tened en cuenta que el formato de la tabla y el nombre de los campos que tenga el dataset deben ser los mismos que los del Datagrid.
En mi caso:
Private Sub montaCausas(ByRef causas As DataSet)
Dim i As Integer
Dim tabla As DataTable
Dim campo As DataColumn
Dim registro As DataRow
tabla = New DataTable(\"Observaciones\")
campo = New DataColumn(\"Seleccionado\", GetType(System.Boolean))
campo.DefaultValue = False
tabla.Columns.Add(campo)
campo = New DataColumn(\"Codigo\", GetType(System.Int32))
tabla.Columns.Add(campo)
campo = New DataColumn(\"Descripcion\", GetType(System.String))
campo.DefaultValue = \"\"
tabla.Columns.Add(campo)
For i = 0 To causas.Tables(\"Textos\").Rows.Count - 1
registro = tabla.NewRow
registro(\"Seleccionado\") = False
registro(\"Codigo\") = CInt(causas.Tables(\"Textos\").Rows(i)(\"Codigo\"))
registro(\"Descripcion\") = CStr(causas.Tables(\"Textos\").Rows(i)(\"Descripcion\"))
tabla.Rows.Add(registro)
Next
dtsPredefinidas.Tables.Add(tabla)
End Sub
Lo siguiente es escribir el código para crear las columnas. Usaremos un TemplateColumn para crear la columna en la especificaremos el chekbox:
Private Sub generaColumnasCausas()
Dim cTexto As BoundColumn
Dim tcol As New TemplateColumn
\' Limpio las posibles columnas que tuvierra el DataGrid
dtgObservaciones.Columns.Clear()
tcol.HeaderText = \"Selecciona\"
tcol.ItemTemplate = New DynamicItemTemplate(True, \"Seleccionado\")
dtgObservaciones.Columns.Add(tcol)
\' Código de observación
cTexto = New BoundColumn
cTexto.DataField = \"Codigo\"
cTexto.HeaderText = \"Código\"
cTexto.HeaderStyle.HorizontalAlign = HorizontalAlign.Center
dtgObservaciones.Columns.Add(cTexto)
\' Observación
cTexto = New BoundColumn
cTexto.DataField = \"Descripcion\"
cTexto.HeaderText = \"Observaciones\"
cTexto.HeaderStyle.HorizontalAlign = HorizontalAlign.Center
dtgObservaciones.Columns.Add(cTexto)
End Sub \' generaColumnasCausas
Si queremos crear un botón en lugar de un chekbox, cambiamos las líneas:
[color=#0000ff][b] Dim tcol As New TemplateColumn
tcol.HeaderText = \"Selecciona\"
tcol.ItemTemplate = New DynamicItemTemplate(True, \"Seleccionado\")
[/b][/color]
por la línea:
[color=#0000ff][b]Dim cBoton As ButtonColumn
cBoton = New ButtonColumn
cBoton.ButtonType = ButtonColumnType.LinkButton
[/b][/color]
También se puede usar PushButton si queremos un botón y no un enlace.
Seguimos para bingo...
Los siguiente a tener en cuenta es que debemos asignar los datos que se van a mostrar al Datagrid y luego hay que refrescarlo para que se muestren:
Private Sub refrescaGridCausas()
Dim vista As DataView
If (orden = 0) Then
vista = New DataView(dtsPredefinidas.Tables(\"Observaciones\"), \"\", \"Descripcion\", DataViewRowState.CurrentRows)
ElseIf (orden = 1) Then
vista = New DataView(dtsPredefinidas.Tables(\"Observaciones\"), \"\", \"Codigo\", DataViewRowState.CurrentRows)
Else
vista = New DataView(dtsPredefinidas.Tables(\"Observaciones\"), \"\", \"Descripcion\", DataViewRowState.CurrentRows)
End If
generaColumnasCausas()
Try
If Not dtsPredefinidas Is Nothing Then
dtgObservaciones.DataSource = vista
dtgObservaciones.DataBind()
End If
Catch ex As Exception
CMessageBox1.Mensaje = ex.Message
CMessageBox1.Tipo = False \'Si es False solo muestra Aceptar. Si es True muestra también el Cancelar
CMessageBox1.muestra() \'Muestra la ventana
End Try
End Sub \' refrescaGridCausas
Ya solo nos queda hacer la llamada para que se monte todo el tinglado en el orden necesario:
[color=#0000ff] Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
montaCausas(dtsPredefinidas)
refrescaGridCausas
End Sub()[/color]