none
Dudas con un DataGrid de WPF RRS feed

  • Pregunta

  • Buenas tades, continuo aprendiendo cosas sobre WPF y Linq. 

    Esta vez tengo una duda acerca de los datagrid, y es la siguiente. Tengo un DataGrid que lo lleno con la siguiente consulta de Linq:

     

    private void Window_Loaded(object sender, RoutedEventArgs e)

            {                       

                List<carga_reg> cg = (from pp in dm.proyecto_pesup

                                     from psc in dm.proyecto_sclasif 

                                     where pp.co_proy == var_co_proy

                                     && pp.co_sclasif == psc.co_sclasif   

                                     select new carga_reg()

                                     {

                                         co_sclasif = pp.co_sclasif,

                                         des_sclasif = psc.des_sclasif,

                                         presup = pp.presup,

                                         rev1 = pp.rev1,

                                         rev2 = pp.rev2,

                                         rev3 = pp.rev3                                 

                                     }).ToList();            

                GrdPresup.ItemsSource = cg;                       

            }

    que a su vez esto proviene de la clase:

     

    public class carga_reg

        {

     

            public string co_sclasif { get; set; }

            public string des_sclasif { get; set; }

            public decimal presup { get; set; }

            public decimal rev1 { get; set; }

            public decimal rev2 { get; set; }

            public decimal rev3 { get; set; }

        }

     

    Aqui esta el código XAML de mi datagrid

    <DataGrid AutoGenerateColumns="False" Height="245" HorizontalAlignment="Left" Margin="12,67,0,0" Name="GrdPresup" VerticalAlignment="Top" Width="716" IsReadOnly="False" CellEditEnding="GrdPresup_CellEditEnding"> 

                <DataGrid.Columns>                

                    <DataGridTextColumn Header="Sub Clasificación" Width="100" Binding="{Binding Path= co_sclasif}"/>

                    <DataGridTextColumn Header="Sub Clasificación" Width="200" Binding="{Binding Path= des_sclasif}"/>                

                    <DataGridTextColumn Header="Presupuestado" Width="100" Binding="{Binding Path= presup}"/>

                    <DataGridTextColumn Header="Rev 1" Width="100" Binding="{Binding Path= rev1}"/>

                    <DataGridTextColumn Header="Rev 2" Width="100" Binding="{Binding Path= rev2}"/>

                    <DataGridTextColumn Header="Rev 3" Width="100" Binding="{Binding Path= rev3}"/>

                </DataGrid.Columns>

            </DataGrid>

     

    La pregunta es muy sencilla, tomando en cuenta que apenas estoy aprendiendo, como puedo hacer para que solo pueda editar las columnas presup, rev1, rev2 y rev3. Ademas estas columnas están en un formato numérico con dos decimales, en estos campos solo debería aceptar números, actualmente si escribo letras me lo permite, a pesar de que cuando pierde el foco me coloca el margen del campo en rojo y deberia mantener el formato. por ejemplo si escribo 1 me lo deja tal cual pero si se puede me gustaria que fuese mas bien 1.00 y no 1.

     

    Mi otra pregunta es una vez hecho los cambios que quiera en estos campos tengo un botón guardar abajo de la ventana al hacer click a este botón se deben enviar los cambios a la tabla de SQL correspondiente (Esto no se como hacerlo) la tabla se llama proyecto_pesup.

    Agradezco de antemano su acostumbrada colaboración.  

     

     


    • Editado CAZA - domingo, 9 de octubre de 2011 22:25
    domingo, 9 de octubre de 2011 22:17

Respuestas

Todas las respuestas

  • Hola Caza.

    La pregunta es sencilla pero son muchas xDD.

    Bien, por partes:

    1.- para establecer una columna como solo lectura, solo tienes que añadir 'IsReadInly="True"' en un DataGridTextColumn.

    2.- para aplicar formato numerico o cualquier otro, tienes que añadir algo asi:

     

    Binding="{Binding Path=rev1, StringFormat=\{0:N2\}}"
    

     

    'StringFormat' es el encargado de establecer el formato para la cadena, en el ejemplo, es un numero con 2 decimales, puedes mirar mas info aqui: http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

    En cuanto a lo de solo dejar insertar numeros, deberias de usar algun control personalizado que implemente alguna mascara, en codeplex existe la Extended Toolkit, que lo implementa:

    http://wpftoolkit.codeplex.com/wikipage?title=MaskedTextBox

    No obstante, es algo facil de hacer y te ayudaria a aprender, te dejo unos links con algunas implementaciones:

    http://www.progware.org/Blog/post/Masked-TextBox-in-WPF-(and-Keyboard-in-WPF).aspx

    http://www.codeproject.com/KB/WPF/MaskableTextBox.aspx

    http://geekswithblogs.net/QuandaryPhase/archive/2008/12/17/wpf-masked-textbox.aspx

    3.- Para esto, depende de como estes enlazando los datos, en caso de que uses EntityFramework solo deberias de llamar a la funcion SaveChanges. No se como lo estas implementando, ya que al grid le asignas una lista y si usaras EntityFramework, le deberias asignar el IEnumerable con los resultados (entre otras cosas por que se usa la ejecucion diferida para consultar y mostrar los resultados, lo que optimiza el proceso).

    Como es un tema bastante largo, te dejo un link donde se explica por encima como usarlo y si tienes problemas en algun punto especifico, comentalo.

    http://www.mikeborozdin.com/post/Data-Manipulations-with-Entity-Framework.aspx

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    • Editado David_González lunes, 10 de octubre de 2011 6:54
    • Propuesto como respuesta CorsarioVasco lunes, 10 de octubre de 2011 7:00
    • Marcado como respuesta CAZA - lunes, 10 de octubre de 2011 14:21
    lunes, 10 de octubre de 2011 6:54
  • Hola David si se que es mucho lo que plantee en esa pregunta, pero muchas gracias por tu amabilidad de responder.

    Voy a revisar todo lo que me escribes aquí con calma y cualquier duda te escribo.

    Agradecido. 


    C. Zapata
    lunes, 10 de octubre de 2011 14:21
  • Hola David si se que es mucho lo que plantee en esa pregunta, pero muchas gracias por tu amabilidad de responder.

    Voy a revisar todo lo que me escribes aquí con calma y cualquier duda te escribo.

    Agradecido. 


    C. Zapata
    David, toda tu respuesta esta excelente hermano. Bien provechosa, mil gracias por sacarme un poco del lago de dudas.
    C. Zapata
    lunes, 10 de octubre de 2011 14:36
  • David, buen dia. Me ha sido de gran utilidad tu ayuda, ahora bien necesito saber algo sobre la ultima pregunta que me contestaste la de gurdar los registros del datagrid en mi BD de sql.

    He guardado reistros que esta en texbox y al final uso SaveChanges(), eso lo entiendo pero en lo que tengo dudas es de como hacer para que el contenido del grid se guarde en la tabla de sql haciendo referencia a todos los registro, tomando en cuenta que el datagrid lo lleno con:

    List<carga_reg> cg = (from pp in dm.proyecto_pesup

                                     from psc in dm.proyecto_sclasif 

                                     where pp.co_proy == var_co_proy

                                     && pp.co_sclasif == psc.co_sclasif   

                                     select new carga_reg()

                                     {

                                         co_sclasif = pp.co_sclasif,

                                         des_sclasif = psc.des_sclasif,

                                         presup = pp.presup,

                                         rev1 = pp.rev1,

                                         rev2 = pp.rev2,

                                         rev3 = pp.rev3                                 

                                     }).ToList();         

    Como vez l que me muestra el grid no es exactamente lo que tengo en la tabla aunque los registros son proporcionales a ellos y los campos por donde debo enlazarlos son co_proy y co_sclasif.

    Por ejemplo supon el caso de que lo que tengo en mi Datagrid lo tuviese en una tabla de SQL (t1), entonces lo que haria seria:

    update proyecto_pesup set presup = t1.pesup, rev1=t1.rev1.....etc

    where proyecto_pesup.co_proy = t1.co_proy and  proyecto_pesup.co_sclasif = t1.co_sclasif.

    Claro pero quiero hacerlo directamente del codigo de mi aplicación, lo que no se es si tengo que recorrer los registros del grid e irlos comparando uno a uno en la bd o si existe una forma mas directade hacer las igualaciones y luego al final Savechanges como me dices en la respuesta. 

    Agradezco mucho tu tiempo.


    C. Zapata
    martes, 11 de octubre de 2011 13:56
  • Hola Caza.

    aqui lo que veo es que no estas enlazando bien el grid con entityframework, de modo que el metodo savechanges no hace nada.

    En la consulta anterior realizas una ejecucion inmediata mediante el metodo extensor ToList(), lo que te crea una lista desde la consulta de EntityFramewok. Esto no deberias hacerlo, deberias asociar la consulta directamente al itemSource, esto tendria la ventaja de usar ejecucion diferida y ademas disponer del contexto de datos de EntityFramework directamente enlazados al grid, de modo que al modificar el grid, se modificaria el contexto y llamando a la funcion SaveChanges, el motor de EntityFramework se encargaria de todo para actualizar y/o eliminar campos de las tablas de la BBDD.

    En resumen, no hagas un ToList() para agregar al itemSource y lo tendrias todo montado, modificas los datos del grid y cuando llames a SaveChanges del contexto de EntityFramework, se actualizara la BBDD.


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    martes, 11 de octubre de 2011 18:01