viernes, 28 de agosto de 2009

GridView linq paginado

Planteamiento:
Queremos establecer el origen de datos de un grid view desde los valores en una serie de combos.
Los combos contienen un listitem "(todos)" con valor "0" y descripciones y codigos desde una base de datos o pueden contener criterios que cambian el orden o establecen un filtro mas complicado.
Y ademas queremos paginar.
Y lo haremos sin el control web visual de linq.

Solucion
Podemos construir el origen de datos mediante una variable system.linq.iqueryable (of datos)
Sobre esta variable vamos a realizar restricciones sucesivas y al final una asignación al grid:
Sub actualizaListaTextos()
Dim Query = From tx In bd.Texto
If cmbPlantilla.SelectedValue <> "0" Then
Dim plan = bd.Plantilla.Single(Function(p As Plantilla) p.idPlantilla = CInt(cmbPlantilla.SelectedValue))
Dim listaIdTextos = From id In plan.TextosPlantilla Select id.idTexto
Query = From tx In bd.Texto Where listaIdTextos.Contains(tx.idTexto)
End If
Select Case cmbPosicion.SelectedValue
Case "0"
Query = From q In Query Order By q.Nombre
Case "1"
Query = From q In Query Where q.OpcionCabeza = True Order By q.OrdenCabeza
Case "2"
Query = From q In Query Where q.OpcionPie = True Order By q.OpcionPie
Case "3"
Query = From q In Query Where q.OpcionCabeza = False And q.OpcionPie = False Order By q.Nombre
End Select
GridTextos.DataSource = From q In Query Select q.idTexto, q.Nombre
GridTextos.DataBind()
End Sub


Cada vez cambia un combo llamamos a este sub:

Protected Sub cmbPlantilla_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles cmbPlantilla.SelectedIndexChanged, cmbPosicion.SelectedIndexChanged
actualizaListaTextos()
End Sub


Nos falta el paginado:

Private Sub GridTextos_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles GridTextos.PageIndexChanging
GridTextos.PageIndex = e.NewPageIndex
actualizaListaTextos()
End Sub


E voilaaa.