miércoles, 4 de septiembre de 2013

Crear un AspxGridView Dinámico haciendo uso de un Pivot SQL Server

En este ejemplo haremos un gridview la cual las columnas son dinámicas de acuerdo a las columnas de un Pivot Grid. Desde código crearemos las columnas con su tipo de datos.

Primeramete solamente arrastramos el GridView, se verá de esta menera:



Luego creamos las columnas que obtenemos del origen de datos:


 Sub crearControles()

        Try
            grdGridView.Columns.Clear() 'Limpiamos las columnas del grid porque por cada postback se crean las columnas nuevamente.

            agregarCommanColumn() 'Si necesitamos hacer uso del Select,New,Update,Delete

            'Si necesitamos agregar template a nuestras colunas
            'se utiliza para mostrar campos no editables y mostrar un label
            Dim labelTemplate As New GridViewTemplate()

            For Each column As DataColumn In dtOrigenDatos.Columns

                Select Case column.ColumnName
                    
                    Case "Id" 'las columnas que no necesitamos agregar al grid
                     'las columnas con propiedades especificas y para agregar el labeltemplate
                     'para las columnas no editables
                    Case "Columna1"
                        Dim txtColumn As New GridViewDataTextColumn()
                        txtColumn.Name = column.ColumnName
                        txtColumn.FieldName = column.ColumnName
                        txtColumn.Settings.HeaderFilterMode = HeaderFilterMode.CheckedList
                        txtColumn.Settings.AutoFilterCondition = AutoFilterCondition.Contains
                        txtColumn.EditFormSettings.Visible = DevExpress.Utils.DefaultBoolean.False
                        txtColumn.EditItemTemplate = labelTemplate
                        grdMontosLimites.Columns.Add(txtColumn)
                    Case "columna2"
                        Dim cmbColumn As New GridViewDataComboBoxColumn()
                        cmbColumn.Name = column.ColumnName
                        cmbColumn.FieldName = column.ColumnName
                        cmbColumn.Settings.HeaderFilterMode = HeaderFilterMode.CheckedList
                        cmbColumn.CellStyle.HorizontalAlign = HorizontalAlign.Center
                        cmbColumn.Width = 50
                        grdMontosLimites.Columns.Add(cmbColumn)
                    Case "Columna4" 'Para valores numéricos no editables
                        Dim txtColumn As New GridViewDataTextColumn()
                        txtColumn.Name = column.ColumnName
                        txtColumn.FieldName = column.ColumnName
                        txtColumn.Settings.HeaderFilterMode = HeaderFilterMode.CheckedList
                        txtColumn.Settings.AutoFilterCondition = AutoFilterCondition.Contains
                        txtColumn.PropertiesTextEdit.DisplayFormatString = "N2"
                        txtColumn.EditItemTemplate = labelTemplate
                        grdMontosLimites.Columns.Add(txtColumn)
                    Case Else   'Si con el mismo tipo de datos en este caso SpinEdit Editables
                        Dim spnColumn As New GridViewDataSpinEditColumn()
                        spnColumn.Name = column.ColumnName
                        spnColumn.FieldName = column.ColumnName
                        spnColumn.PropertiesSpinEdit.DisplayFormatString = "N2"
                        spnColumn.PropertiesSpinEdit.SpinButtons.ShowIncrementButtons = False
                        spnColumn.Settings.HeaderFilterMode = HeaderFilterMode.CheckedList
                        grdMontosLimites.Columns.Add(spnColumn)

                End Select

            Next

        Catch ex As Exception
             Throw ex
        End Try
    End Sub


Sub agregarCommanColumn()

        If grdGridView.Columns.IndexOf(grdGridView.Columns("CommandColumn")) <> -1 Then
            Return
        End If

        Dim col As New GridViewCommandColumn()
        col.Name = "CommandColumn"
        col.ShowSelectCheckbox = True
        col.Caption = " "
        col.ButtonType = ButtonType.Image
        col.EditButton.Visible = True
        col.EditButton.Image.Url = "~/images/note_edit.png"
        col.CancelButton.Visible = True
        col.CancelButton.Image.Url = "~/images/Cancel_Icon_64.png"
        col.UpdateButton.Visible = True
        col.UpdateButton.Image.Url = "~/images/data_floppy_disk.png"
        col.VisibleIndex = 0
        grdMontosLimites.Columns.Add(col)
    End Sub

Por Ultimo hacemos nuestro llenado del GridView:


 ''' <summary>

    ''' Método para llenar un grid view devexpress
    ''' </summary>
    ''' <param name="grdControl">Control devexpress</param>
    ''' <param name="strCampoLlave">campos llave separado por coma</param>
    ''' <param name="objRecursoDeDato">objeto recurso para llenar el control</param>
    ''' <remarks></remarks>
    Public Sub cargarGridView(ByVal grdControl As ASPxGridView, ByVal strCampoLlave As String, ByVal objRecursoDeDato As Object)

Try

            With grdControl
                .DataSource = objRecursoDeDato
                .KeyFieldName = strCampoLlave
                .DataBind()
            End With
 Catch ex As Exception
       Throw ex
 End Try
End Sub

Clase del GridViewTemplate:

Imports DevExpress.Web.ASPxGridView
Imports DevExpress.Web.ASPxEditors
Imports System.Web.UI
Imports System.Web.UI.WebControls

Public Class GridViewTemplate

    Implements ITemplate

    ''' <summary>
    ''' Agrega label para campos no editables
    ''' </summary>
    ''' <remarks></remarks>
    Private Function agregarLabel(ByVal strValor As Object) As ASPxLabel
        Dim lbl As New ASPxLabel
        lbl.Text = If(IsDBNull(strValor), "", strValor)
        Return lbl
    End Function

  Public Sub InstantiateIn(ByVal container As System.Web.UI.Control) Implements System.Web.UI.ITemplate.InstantiateIn

                Dim strNombreColumna = TryCast(container, GridViewDataItemTemplateContainer).Column.FieldName
                container.Controls.Add(agregarLabel(DataBinder.Eval(TryCast(container, GridViewDataItemTemplateContainer).DataItem, strNombreColumna)))

       
    End Sub

End Class

2 comentarios:

  1. Me podrias decir de donde obtienes strCampoLlave,objRecursoDeDato y grdControl

    ResponderBorrar
  2. StrCampoLlave: es el nombre de la columna llave de tu tabla ejemplo: Tabla Estudiante. Llave: IdEstudiante.

    objRecursoDeDato: es el origen de datos, la consuta a la bases de datos que retorne un DataTable.

    grdControl: es el nombre del control GridView.

    ResponderBorrar