2011-05-25 28 views
6

Tengo un GridView en mi página ASPX.Persisting DataSource en GridView después de PostBack

Cuando hago clic <asp:Button id="btnBindIt" runat="server" /> se une a una tabla de datos de la siguiente manera:

theDataTable = GetAllTheRecords(); 
gvTheGridView.DataSource = theDataTable; 
gvTheGridView.DataBind(); 

Nota: theDataTable es un miembro

private DataTable theDataTable; 

Esto funciona como se esperaba.

Ahora, después de que el GridView se muestra muy bien, quiero exportar los datos a CSV, por lo que ahora haga clic en el <asp:Button id="btnExportIt" runat="server" /> que se ejecuta el código:

exportToCsv(theDataTable); 

pero theDataTable es nulo.

Así que traté

exportToCsv(gvTheGridView.DataSource) 

Lo que también es nulo.

¿Cuál es la forma estándar de conservar estos datos? Realmente no quiero volver a golpear el DB ya que es un SPROC bastante largo y el usuario ya ha esperado una vez.

¡Gracias de antemano!

Respuesta

-2

Gracias por las respuestas a todos.

Me alejo de poner cosas en el VeiwState o sesión innecesariamente, por lo que creo que la mejor manera de conservar estos datos es guardarlos en caché.

Creo que el MemoryCache es el lugar más apropiado para esto, así es como terminé implementándolo.

+1

-1: http: // stackoverflow.com/questions/15408117/why-isnt-caching-system-web-caching-cache-used-for-state-management –

+0

Creo que es una mala idea almacenar grandes cantidades de datos como este en la sesión. Para mí, mi solución fue no almacenar los resultados que planifiqué en el enlace de datos, sino hacer que la consulta que obtenía los resultados fuera más rápida mediante el almacenamiento en caché. Funcionó bien para mi situación. –

11

Las variables de nivel de clase no pueden mantener su valor en la devolución de datos.

Pero hay dos maneras en que puede mantener los datos en la publicación de la página: ViewState and Session State. Pero yo sugeriría en su Escenario para ponerlo en el ViewState.

ViewState["theDataTable"] = theDataTable; 
Session["theDataTable"] = theDataTable; 

Y entonces se puede acceder a él en la página de devolución de datos:

DataTable theDataTable = (DataTable)ViewState["theDataTable"]; 
DataTable theDataTable = (DataTable)Session["theDataTable"]; 
+0

Gracias Muhammed. Me preocupa usar la sesión o viewstate con un gran conjunto de datos. ¿Recomendarías hacer esto para un gran conjunto de datos? –

+0

¿Qué sucede si exporta datos de Gridview a CSV? –

+0

Otra forma es, puede iterar sus filas de Gridview en el servidor y extraer DataTable de Gridview y luego exportarlo csv. –

5

declarar la tabla de datos de la siguiente manera y todo funcionará como se espera

private string _theDataTable="theDataTable"; 
    private DataTable theDataTable 
    { 
      get 
      { 
        if(ViewState[_theDataTable]==null) 
          return new DataTable(); 
        return (DataTable)ViewState[_theDataTable]; 
      } 
      set 
      { 
        ViewState[_theDataTable] = value; 
      } 
    } 

saludos!

+0

en lugar de escribir 'return new DataTable();' en caso de que ViewState sea nulo, sería mejor obtener datos actualizados del origen de datos (base de datos o lo que sea). – WAQ

Cuestiones relacionadas