miércoles, 17 de septiembre de 2008

ASP.NET. Conservar SelectCommand de SqlDatasource entre postbacks

Todos hemos flipado la primera vez que en dos patadas hemos enganchado un SqlDataSource a un GridView y automáticamente hemos obtenido contenido de la b.d. en nuestro grid, siendo capaces de paginarlo, ordenarlo... todo funciona de maravilla con el SelectCommand del SqlDataSource que hemos establecido en tiempo de diseño.

El siguiente paso es modificar ese SelectCommand en función de los criterios aportados por el usuario. Ponemos el típico botón buscar y en su evento "click" construimos nuestro SelectCommand. La primera página del grid se carga correctamente, pero si intentamos paginar ya la cosa se fastidia...

Esto es debido a que, por razones obvias de seguridad, el control SqlDataSource no guarda por defecto ninguno de sus comandos (select, update, etc...) en el ViewState. Como consecuencia, su contenido no se conserva entre postbacks, y es necesario almacenarlo de alguna manera y asignarlo en cada load si queremos que perdure.

Una manera de hacerlo es usar el propio viewstate, pero teniendo la precaución indispensable de encriptarlo. Para ello añadimos en la directiva page de nuestro aspx:

ViewStateEncryptionMode="Always"


En el click del botón construimos el selectCommand y lo almacenamos en el viewstate:

Protected Sub btBuscar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
ViewState("selectGrid") = "select * from tabla"
SqlDataSource1.SelectCommand = ViewState("selectGrid")
End Sub


Para recuperarlo en el load de la página:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not ViewState("selectGrid") Is Nothing Then
SqlDataSource1.SelectCommand = ViewState("selectGrid")
End If
End Sub

No hay comentarios: