none
DataGrid de WPF con cantidad de columnas variables (C#, EF) RRS feed

  • Pregunta

  • Buenas noches estimados amigos tengo un nuevo problema, esta vez se trata de un Datagrid el cual necesito que tenga cantidad de columnas variables dependiendo de la cantidad de registros guardados en una tabla que estaría estructurada así:


    El asunto es que debo iniciar un proyecto (Que son los códigos 001 y 002 representan dos proyectos) , los proyectos tienen una fecha de inicio y fin y se desea llevar un control presupuestario mensual (GADM Y PAPEL simbolizan gastos administrativos y papel de oficina) el proyecto 001 durara dos meses y el proyecto 002 un solo mes, como el proyecto 001 durara dos meses necesito que aquí pueda mostrar una ventana con dos columnas que representen los meses de Mayo y Junio, a diferencia del proyecto 002 que mostrara solo una columna de monto con solo el mes de mayo. Esto para poner un ejemplo pero pueden haber proyectos que duren 1 dos o tres años por lo que el datagrid debe ser flexible para alojar tantas columnas como meses tengan los proyectos.

    He pensado que es la mejor forma practica de hacerlo, pero si tienen una mejor idea que simplifique esto pero sin desmejorar la comodidad de visualizar la información para el usuario se lo agradezco.

    Gracias por su apoyo de antemano. 


    C. Zapata



    • Editado CAZA - lunes, 7 de mayo de 2012 3:17
    lunes, 7 de mayo de 2012 3:10

Respuestas

  • Buenos días, indagando un poco y con algo de creatividad logre hacer lo que quería lo coloco aqui por si alguen le hace falta.

    Tal vez no sea la mejor manera de hacerlo pero me funciono muy bien para lo que quiero, el resultado es precisamente lo que buscaba y muy sencillo:

    //Primero el select que recopila los datos que necesito
    
    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.Sum(x => x.fecha.Month),
                                         ano = d.Sum(x => x.fecha.Year),
                                         co_proy = d.Select(x => x.co_proy).FirstOrDefault(),
                                         monto = d.Sum(x => x.monto)
                                     }).ToList();
    
    //Ahora creo una variable 
    
    int conta = 0; //Para establecer la columna en el foreach
    
    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; //(conta+1).ToString();
                    conta = conta + 1;
                }
    

    Si tienen sugerencias para optimizar esto se los agradezco, pero funciona al 100%.

    Gracias por el apoyo. 

     

    C. Zapata

    • Marcado como respuesta CAZA - domingo, 13 de mayo de 2012 14:12
    domingo, 13 de mayo de 2012 14:11

Todas las respuestas

  • Se me ocurre que determines el rango más grande de meses que necesites mostrar, y que retornes para todos los registros información en todos los meses, aunque estén en ceros.

    Blog: Silverideas

    lunes, 7 de mayo de 2012 18:29
  • Muchas gracias Nestor por responder, bueno pensé en eso pero el asunto es que es muy variable, de paso hay dos tipos de contratos unos que son mensuales y otros que pueden durar un año por ejemplo ó menos pero si se necesita mas control pueden reducir los lapsos de tiempo en quincenales o semanales, a nivel de la bd se como hacer pero no se si WPF permite eso. He leído algunos temas donde dicen que puede hacerse pero no comprendo bien los ejemplo que ahí colocan. Si no existe alguna manera tendré que usar esta alternativa, mi temor es que llegue a colocar un máximo de tiempo pero que en algún momento me quede corto.

    Gracias y evaluare a ver si no hay mas alternativa haré eso.


    C. Zapata

    lunes, 7 de mayo de 2012 19:08
  • Buenos días, indagando un poco y con algo de creatividad logre hacer lo que quería lo coloco aqui por si alguen le hace falta.

    Tal vez no sea la mejor manera de hacerlo pero me funciono muy bien para lo que quiero, el resultado es precisamente lo que buscaba y muy sencillo:

    //Primero el select que recopila los datos que necesito
    
    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.Sum(x => x.fecha.Month),
                                         ano = d.Sum(x => x.fecha.Year),
                                         co_proy = d.Select(x => x.co_proy).FirstOrDefault(),
                                         monto = d.Sum(x => x.monto)
                                     }).ToList();
    
    //Ahora creo una variable 
    
    int conta = 0; //Para establecer la columna en el foreach
    
    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; //(conta+1).ToString();
                    conta = conta + 1;
                }
    

    Si tienen sugerencias para optimizar esto se los agradezco, pero funciona al 100%.

    Gracias por el apoyo. 

     

    C. Zapata

    • Marcado como respuesta CAZA - domingo, 13 de mayo de 2012 14:12
    domingo, 13 de mayo de 2012 14:11