none
Binding dinamico en Datagrid de WPF RRS feed

  • Pregunta

  • Buenos días, vengo nuevamente por acá con una nueva pregunta acerca de los enlaces a datos con WPF, mi apicación como en casos anteriores esta realizada en WPF, EF y C# con bd de SQL.

    El asunto es que tengo un datagrid que se establecen las columnas de forma dinamica de acuerdo a un periodo de tiempo (meses) de la siguiente manera:

    private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                
                List<llena_gt> gp = (from x in dm.proy_presup_t
                                     where x.co_proy == lab_coproy.Content
                                     group x by new { x.co_proy,x.fecha.Year,x.fecha.Month } into d
                                     select new llena_gt 
                                     {
                                         mes = d.Select(x => x.fecha.Month).FirstOrDefault(),
                                         ano = d.Select(x => x.fecha.Year).FirstOrDefault(),
                                         co_proy = d.Select(x => x.co_proy).FirstOrDefault(),
                                         monto = d.Sum(x => x.monto)
                                     }).ToList();
    
                dg_presup.Columns.Add(new DataGridTextColumn()); //Define las caracteristicas de cada columna
                ((DataGridTextColumn)dg_presup.Columns[0]).Binding = new Binding();
                ((DataGridTextColumn)dg_presup.Columns[0]).Header = "Código";
                ((DataGridTextColumn)dg_presup.Columns[0]).Width = 100;
                ((DataGridTextColumn)dg_presup.Columns[0]).IsReadOnly = true;
                
    
                dg_presup.Columns.Add(new DataGridTextColumn());
                ((DataGridTextColumn)dg_presup.Columns[1]).Binding = new Binding();
                ((DataGridTextColumn)dg_presup.Columns[1]).Header = "Sub Partida";
                ((DataGridTextColumn)dg_presup.Columns[1]).Width = 300;
                ((DataGridTextColumn)dg_presup.Columns[1]).IsReadOnly = true;
    
                StringBuilder carga_filas = new StringBuilder(); //Esta es la cadena que se armara para poder añadir los registros al grid
                
                //int conta = 2; //Para establecer la columna en el foreach es necesario
                            
                foreach (var j in gp) //Esto me funciona para generar las columnas
                {
                    string f_heder = "";
    
                    #region Establece el mes del año y lo guarda en f_heder
    
                    switch (j.mes)
                    {
                        case 1:
                            f_heder = "Enero " + j.ano.ToString();
                            break;
                        case 2:
                            f_heder = "Febrero " + j.ano.ToString();
                            break;
                        case 3:
                            f_heder = "Marzo " + j.ano.ToString();
                            break;
                        case 4:
                            f_heder = "Abril " + j.ano.ToString();
                            break;
                        case 5:
                            f_heder = "Mayo " + j.ano.ToString();
                            break;
                        case 6:
                            f_heder = "Junio " + j.ano.ToString();
                            break;
                        case 7:
                            f_heder = "Julio " + j.ano.ToString();
                            break;
                        case 8:
                            f_heder = "Agosto " + j.ano.ToString();
                            break;
                        case 9:
                            f_heder = "Septiembre " + j.ano.ToString();
                            break;
                        case 10:
                            f_heder = "Octubre " + j.ano.ToString();
                            break;
                        case 11:
                            f_heder = "Noviembre " + j.ano.ToString();
                            break;
                        case 12:
                            f_heder = "Diciembre " + j.ano.ToString();
                            break;
                        default:
                            MessageBox.Show("Hay fechas fuera de los meses del año revise el switch");
                            break;
                    }
    
                    #endregion
    
                    dg_presup.Columns.Add(new DataGridTextColumn());
                    ((DataGridTextColumn)dg_presup.Columns[conta]).Binding = new Binding();
                    ((DataGridTextColumn)dg_presup.Columns[conta]).Header = f_heder;
                    ((DataGridTextColumn)dg_presup.Columns[conta]).IsReadOnly = false;
                    conta ++; //Suma una columna en cada recorrido
                }
    
    
            }


    En resumen el código lo que hace es recorrer un select de Linq que esta formado por registros de fecha que son la base para establecer la cantidad de columnas que contendrá el datagrid, hasta aqui todo excelente (funciona buen).

    Mi problema viene ahora como puedo llenar las filas que contendrá ese datagrid, he leido sobre las consultas de linq dinámicas usando System.Linq.Dynamic  pero al hacer una prueba como esta:

    var dg_valor = (dm.proy_presup_t
                               .Where("co_proy ==  "+lab_coproy.Content)
                               .Select("proy_presup_t.co_proy")).ToList();

    me genera error me dice:

    'co_proy' no es un miembro de 'Transient.collection[ProyecModel.proy_presup_t(Nullable=True,DefaultValue=)]'. Para extraer una propiedad de un elemento de colección, use una subconsulta que recorra en iteración la colección. Cerca de identificador simple, línea 8, columna 15.

    Pienso que si puedo lograr hacer estas consultas dinamicas pudiese solucionar mi problema pero planteo el caso completo por si alaguen tiene una idea mejor que me ayude a solventar mi situación.

    Muchísimas gracias de antemano.

     

    C. Zapata

    lunes, 28 de mayo de 2012 14:21

Respuestas

  • Buenos días encontre solución a lo de Linq por si a alaguen le sirve. Plantee mi selección de la siguiente forma:

    var dg_valor = dm.proy_presup_t
                               .Where("co_proy ==  @0 ","001")
                               .Select("new(co_proy,co_sclasif)"); 

    En verdad es mas simple de lo que pensaba y funciona bien ahora pienso recorrer la consulta y con un foreach ver como puedo ensamblar a mi necesidad.

    Si tienen sugerencias al respecto se los agradecería mucho, gracias. 

      

    C. Zapata

    • Marcado como respuesta CAZA - martes, 29 de mayo de 2012 12:39
    lunes, 28 de mayo de 2012 16:04

Todas las respuestas

  • Buenos días encontre solución a lo de Linq por si a alaguen le sirve. Plantee mi selección de la siguiente forma:

    var dg_valor = dm.proy_presup_t
                               .Where("co_proy ==  @0 ","001")
                               .Select("new(co_proy,co_sclasif)"); 

    En verdad es mas simple de lo que pensaba y funciona bien ahora pienso recorrer la consulta y con un foreach ver como puedo ensamblar a mi necesidad.

    Si tienen sugerencias al respecto se los agradecería mucho, gracias. 

      

    C. Zapata

    • Marcado como respuesta CAZA - martes, 29 de mayo de 2012 12:39
    lunes, 28 de mayo de 2012 16:04
  • Bien ahora cambió mi pregunta por que ahora mi duda es como hacer una consulta como esta:

    ar dg_valor2 = from x in dm.proy_presup_t
                                join y in dm.proy_sclasif on x.co_sclasif equals y.co_sclasif                            
                                select new { x.co_sclasif, y.des_sclasif };

    en dinamica, no se como usar los join en este tipo de consulta.

    Agradezco mucho su apoyo.


    C. Zapata

    martes, 29 de mayo de 2012 1:52