0

Tengo un problema al bindear un gridview, ya que necesito que al terminar las operaciones de un metodo estatico se recarguen los datos de un gridview, coloque un breakpoint para saber donde estaba el error y me marca cuando asigno el datatable a datasource del gridview

        public static string GetDataAjax(int proyecto, int concepto,string descripcion, int cantidad, double precio, double subtotal, string fechaComprobante, string operacion, string sesion)
    {
        string mensajeOperacion="";

        clCajaChica oProyectoGto = new clCajaChica();

        EntidadProyectoGasto EntProyectoGto = new EntidadProyectoGasto();

        EntProyectoGto.IDProyecto = Convert.ToInt32(proyecto);
        EntProyectoGto.IDConceptoGasto = Convert.ToInt32(concepto);
        EntProyectoGto.Descripcion = descripcion;
        EntProyectoGto.Cantidad = Convert.ToInt32(cantidad);
        EntProyectoGto.PrecioUnitario = Convert.ToDouble(precio);
        EntProyectoGto.SubTotal = Convert.ToDouble(subtotal);
        EntProyectoGto.FechaComprobante = Convert.ToDateTime(fechaComprobante);
        EntProyectoGto.UrlArchivo = "x";
        EntProyectoGto.IDUsuarioAlta = Convert.ToInt32(sesion);
        EntProyectoGto.FechaAlta = Convert.ToDateTime(DateTime.Now);
        EntProyectoGto.IDUsuarioModifica = Convert.ToInt32(sesion);
        EntProyectoGto.FechaModifica = Convert.ToDateTime(DateTime.Now);

        if (operacion == "Agregar")
        {
            if (oProyectoGto.InsertarProyectoGasto(EntProyectoGto) > 0)
            {
                ControlEscolar_CajaChica_DatosProyectosEfectivo instance = new ControlEscolar_CajaChica_DatosProyectosEfectivo();

                using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
                {
                    SqlCommand cmd = new SqlCommand("SELECT  pg.ID_ProyectoGasto, pg.ID_Proyecto, p.tituloproyecto, pg.ID_ConceptoGasto,        cg.conceptogasto, pg.Descripcion,pg.Cantidad,pg.PrecioUnitario,pg.SubTotal,pg.FechaComprobante, pg.UrlArchivo,pg.Validado,pg.Eliminado  FROM ProyectosGastos pg INNER JOIN Proyectos p ON p.id_proyecto = pg.id_proyecto INNER JOIN ConceptosGastos cg ON cg.id_conceptogasto = pg.id_conceptogasto WHERE pg.id_proyecto = '" + proyecto + "' AND pg.Eliminado <> 1 ORDER BY pg.ID_ProyectoGasto DESC", con);
                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                    DataTable dt = new DataTable();
                    adapter.Fill(dt);
                    instance.GridView1.DataSource = dt;
                    instance.GridView1.DataBind();
                }                
                mensajeOperacion = "ok";
            }
            else
            {
                mensajeOperacion = ("No se pudo agregar el registro.");
            }
        }
        return mensajeOperacion;

    }

Este es el error introducir la descripción de la imagen aquí

Ivxn
  • 1,879
  • 9
  • 35
  • 67
  • Podrías [edit] tu pregunta y agregar el código de la clase `ControlEscolar_CajaChica_DatosProyectosEfectivo`. Pueda que la propiedad `GridView1` nunca lo estás inicializando. – Davlio Jan 05 '18 at 00:12
  • @Davlio la clase ControlEscolar_CajaChica_DatosProyectosEfectivo es el codebehind de la pagina que contiene el griview, solo que la instancia para poder tener acceso a la propiedad datasource y bind del gridview – Ivxn Jan 05 '18 at 00:31
  • Es totalmente diferente mi pregunta – Ivxn Jan 05 '18 at 02:44
  • Hola, puedes verificar una vez se detenga la ejecución de tu aplicación por la excepción el contenido de la variable `instance`? Lo más seguro que no esté inicializada – Sergio Parra Guerra Jan 05 '18 at 09:03
  • @SergioParraGuerra y como la puedo inicializar? – Ivxn Jan 05 '18 at 09:28
  • Habría que ver el código de tu clase para poder darte una respuesta más óptima. Dónde tienes definida esa variable? supongo que en vez de `instance`debes escribir `this` – Sergio Parra Guerra Jan 05 '18 at 09:33
  • Qué necesidad hay de establecer ese método como estático? – Sergio Parra Guerra Jan 05 '18 at 10:28
  • @SergioParraGuerra es que estoy usando ajax con c# sharp y para pder procesar mis datos es necesario establecer un webmethod y pues este debe ser estatico – Ivxn Jan 05 '18 at 18:42

2 Answers2

0

Asignar desde un método estático a un GridView en un entorno Web es una mala práctica ya que una misma instancia de tu método sirve para dar servicio a múltiples llamadas. Si quieres establecer el Grid desde Ajax, es necesario enviar los datos de vuelta de tu método como se muestra aquí.

Camilo
  • 115
  • 4
Sergio Parra Guerra
  • 1,956
  • 1
  • 9
  • 11
0

El método al cual estás accediendo es estático y por lo tanto no puedes acceder a los elementos de la página, debes pasar el elemento GridView al método como parámetro de la función. Puedes hacer una funcion intermedia própia del codebehind que llame al método estático dado que desde el codebehind sí tienes acceso al GridView.

También puedes referenciar la página de la siguiente forma:

if (HttpContext.Current != null)
{
        Page page = (Page)HttpContext.Current.Handler;
        TextBox TextBox1 = (TextBox)page.FindControl("TextBox1");
}

Aunque no es para nada recomendable usar métodos estáticos en el codebehind de una página, lo mejor sería que lo usaras como un método normal al hacer postback en la página.

Arngue
  • 569
  • 3
  • 10
  • es que estoy usando ajax con c# y para poder procesar mis datos es necesario establecer un webmethod y pues este debe ser estatico y desde el metodo estatico no puedo tener acceso a mis controles web – Ivxn Jan 05 '18 at 18:44
  • @Amgue me genera un error en el findcontrol, reviso el valor de la variable que en este caso es TextBox1 y me aparece null – Ivxn Jan 05 '18 at 19:06
  • Estas seguro que en tu pagina tienes un elemento con el `ID "TextBox1"`? – Arngue Jan 08 '18 at 07:33
  • si, existe ese control, es muy extraño – Ivxn Jan 08 '18 at 23:16
  • Pués la verdad no sé nunca me he topado con tu situación. Prueba sinó a pasar el elemento page como parámetro de la función, puede que tu HttpContext no sea el adiente a la petición. – Arngue Jan 09 '18 at 08:14