none
Agregar varias consultas (rows) en un Gridview ASP y SQL RRS feed

  • Pregunta

  • tengo una tabla con una lista enorme de materiales, necesito seleccionar varios materiales para posteriormente generar un PDF con dichos materiales, estoy trabado en esa parte puesto que no se como ir agregando varios materiales sin que se borre el primero, es decir, el usuario hará aprox 5-10 SELECT pero ahora mismo solo puedo mostrar 1 en el gridview

     protected void btnBuscarMat_Click(object sender, EventArgs e)
       {
        if (String.IsNullOrEmpty(txtNombre.Text))
        {
            ScriptManager.RegisterStartupScript(this.Page, 
              this.Page.GetType(),
                      "err_msg",
                      "alert('Ingrese # de Material');",
                      true);
        }
        else
        {
            SqlDataAdapter da = new SqlDataAdapter("SELECT 
             parte,descripcion,ublinea,ubalmacen,cantcajas,plataforma,parada 
             from pfp_ayudas_viajeras where reg like '" + txtNombre.Text + "%'", cn);
            DataTable dt = new DataTable();
            da.Fill(dt);
            this.GridView1.DataSource = (dt);
            GridView1.DataBind();
        }
    }


    martes, 26 de mayo de 2020 16:07

Respuestas

  • Presumo que todas las consultas van a devolver las mismas columnas, ¿es así?

    En ese caso hay una forma muy sencilla de acumular los registros devueltos por todas las consultas: El método Fill del dataAdapter añade el resultado de la consulta al DataTable que le pasas como argumento (a no ser que le pases una configuración que sirve para limpiar la tabla antes de cargarla, pero por defecto no la limpia).

    Entonces está claro lo que puedes hacer: simplemente saca la declaración de dt para que no sea una variable local, sino una variable de clase, de forma que no se vuelva a construir un DataTable vacío cada vez que haces una consulta, sino que se reutilice el mismo datatable que ya dejaste cargado de datos la vez anterior. De esta manera, se van añadiendo registros en dt, y cuando lo asignas al DataSource el grid muestra todos los datos.

    Nota: Si las varias consultas no las vas a hacer en un único postback sino en varios postbacks separados, entonces recuerda que en asp.net se pierden todas las variables de clase a cada postback, así que no te vale lo de guardar el dt a nivel de clase. En este caso tendrías que guardarlo en el Session.

    martes, 26 de mayo de 2020 16:40

Todas las respuestas

  • Presumo que todas las consultas van a devolver las mismas columnas, ¿es así?

    En ese caso hay una forma muy sencilla de acumular los registros devueltos por todas las consultas: El método Fill del dataAdapter añade el resultado de la consulta al DataTable que le pasas como argumento (a no ser que le pases una configuración que sirve para limpiar la tabla antes de cargarla, pero por defecto no la limpia).

    Entonces está claro lo que puedes hacer: simplemente saca la declaración de dt para que no sea una variable local, sino una variable de clase, de forma que no se vuelva a construir un DataTable vacío cada vez que haces una consulta, sino que se reutilice el mismo datatable que ya dejaste cargado de datos la vez anterior. De esta manera, se van añadiendo registros en dt, y cuando lo asignas al DataSource el grid muestra todos los datos.

    Nota: Si las varias consultas no las vas a hacer en un único postback sino en varios postbacks separados, entonces recuerda que en asp.net se pierden todas las variables de clase a cada postback, así que no te vale lo de guardar el dt a nivel de clase. En este caso tendrías que guardarlo en el Session.

    martes, 26 de mayo de 2020 16:40
  • Buen dia Alberto, intenté hacerlo pero no tuve éxito, declaré la variable dt después de los archivos using pero sigue sin funcionarme.
    miércoles, 27 de mayo de 2020 20:00
  • Por eso en mi respuesta se proporcionaban varias explicaciones acerca de cuándo y bajo qué circunstancias puede o no funcionar lo de sacar el dt. Si dieras detalles acerca de cuáles de ellas son aplicables a tu caso, y cómo tienes configurada la clase y en qué sitios concretos has sacado la variable, y cómo y cuándo se llena, podríamos afinar un poco más cómo resolver el caso concreto de que se trate.

    Por ejemplo, donde decía que si las varias consultas se hacen en el mismo postback se aplican cosas distintas que si se hacen en distinto postback, como mínimo podrías mencionar cuál de estos dos casos te es aplicable para que a partir de ahí podamos seguir afinando.

    Y dado que no es legal poner una declaración justo después de los "using", sino que tiene que estar dentro de una clase, si mostrases un poco de código enseñando cómo exactamente lo has puesto pues también ayudaría mucho. Lo de "lo he puesto y sigue sin funcionar" no es suficientemente informativo.

    miércoles, 27 de mayo de 2020 20:25