none
Como puedo llenar un datagrid o datagridview manualmente

    Question

  • Hola

    Desarrollo en VS 2010 C# en particular WPF con enlaces a SQL, tengo la ventana de facturas en la cual necesito poner un control en el cual se capturen todos los articulos a facturarse que control me recomiendan y como debo usarlo? Datagrid o Datagridview?

    Cual es mejor? necesito crear una regilla que me permita meterle datos desde el teclado por ejemplo en una celda poner el codigo y esta hacer una consulta a la base de datos y trarse el nombre y precio y ponerlos en las siguientes celdas.

    Ojala y pueda alguien ayudarme se lo agracedeceria en mucho

    un saludo

    gracias

    Friday, October 28, 2011 11:03 PM

Answers

  • Hola,

    Mira este ejemplo que te puede orientar.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.ComponentModel;
    
    namespace WpfApplication1
    {
        /// <summary>
        /// Lógica de interacción para MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                this.Loaded += (ob, ev) =>
                    {
                        this.dataGrid1.ItemsSource = new List<Persona>()
                        {
                            new Persona(){Id=1,Nombre="Persona1",Telefono="4444"},
                            new Persona(){Id=2,Nombre="Persona2",Telefono="5555"},
                        };
                    };
            }
    
            private void dataGrid1_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
            {
                if (e.Column.DisplayIndex == 0)
                {
                    Persona p = e.Row.Item as Persona;
                    if (p != null)
                    {
                        int Id = int.Parse(e.EditingElement.GetValue(TextBox.TextProperty).ToString());
    
                        //Aqui busco en la BB.DD y refesco las columnas
    
                        p.Nombre = "Hola";
                    }
                }
            }
    
           
        }
        public class Persona:INotifyPropertyChanged
        {
            private int _Id;
            private string _Nombre;
            public int Id {
                get { return this._Id; }
                set
                {
                    if (this.Id != value)
                    {
                        _Id = value;                    
                        OnPropertyChanged("Id");
                        
                    }
                }
            }
            public string Nombre
            {
                get { return this._Nombre; }
                set
                {
                    if (this.Nombre != value)
                    {
                        _Nombre = value;
                        OnPropertyChanged("Nombre");
                    }
                }
            }
    
            public string Telefono { get; set; }
    
            public virtual void OnPropertyChanged(string Propiedad)
            {
                if (this.PropertyChanged != null)
                {                
                    this.PropertyChanged(this, new PropertyChangedEventArgs(Propiedad));
                }
            }
            public event PropertyChangedEventHandler PropertyChanged;
        }
    }
    
    


    El Xaml sería este

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <DataGrid AutoGenerateColumns="true" Height="210" HorizontalAlignment="Left" Margin="18,44,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="421" CellEditEnding="dataGrid1_CellEditEnding" />
        </Grid>
    </Window>
    


    Fíjate en la definición de la clase y la implementación de INotifyPropertyChanged eso es lo que hace que se refresque el valor de la columna Nombre.

    De todas formas no me gusta esta forma de hacer las cosas, si trabajas en WPF, Silverlight o Windows Phone 7 te debes de plantear muy seriamente implementar el patron MVVM, aquí tienes un framework bastante utilizado http://mvvmlight.codeplex.com/.

    Eso por una parte y por otra yo separaría funcionalidades en un Formulario tendría la vista del Grid, sin edición y en otro la edición del registro, Es decir la búsqueda la haría en este último.

    Saludos,


    phurtado
    • Marked as answer by jesl Wednesday, November 02, 2011 12:35 AM
    Saturday, October 29, 2011 8:01 PM

All replies

  • hola

    pero la aplciacion es WPF ? porque mencioans el DataGridView y este en WPF no existe

    WPF DataGrid Practical Examples

    lo que aconsejaria es que los datos no los agregues directo al control, sino que los debes ingresar al origen de datos que uses para el grid

    por ejemplo si este lo unes a un dataset o datatable, a este le agregas el registro y luego lo vinculas al grid

    si usas una coleccion (o lista) de datos, a este le agregas el item, y luego lo vinculas al grid

    al grid de wpf no le pones los datos directo, lo haces a la fuente de datos que luego vinculas al control

     

    Datagrid o Datagridview?

    si estas en WPF, no creo que puedas hacer esta comparacion porque solo hay un grid

    el DataGridView no puede usarlo porque este es para aplicaciones winForm

    ahora si estas en Winforms sin duda usa el DataGridView

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Saturday, October 29, 2011 1:49 AM
  • Leandro

    Muchas gracias

    Mira si es una aplicacion WPF y si solo tiene DataGrid ya he leido y visto muchos ejemplos de como funciona ese control, pero eso que me dices no se como hacerlo.

    Si puedes ser mas especifico por favor

    Gracias de nuevo

    Saludos

    Saturday, October 29, 2011 2:34 PM
  • Hola,

    Mira este ejemplo que te puede orientar.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.ComponentModel;
    
    namespace WpfApplication1
    {
        /// <summary>
        /// Lógica de interacción para MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                this.Loaded += (ob, ev) =>
                    {
                        this.dataGrid1.ItemsSource = new List<Persona>()
                        {
                            new Persona(){Id=1,Nombre="Persona1",Telefono="4444"},
                            new Persona(){Id=2,Nombre="Persona2",Telefono="5555"},
                        };
                    };
            }
    
            private void dataGrid1_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
            {
                if (e.Column.DisplayIndex == 0)
                {
                    Persona p = e.Row.Item as Persona;
                    if (p != null)
                    {
                        int Id = int.Parse(e.EditingElement.GetValue(TextBox.TextProperty).ToString());
    
                        //Aqui busco en la BB.DD y refesco las columnas
    
                        p.Nombre = "Hola";
                    }
                }
            }
    
           
        }
        public class Persona:INotifyPropertyChanged
        {
            private int _Id;
            private string _Nombre;
            public int Id {
                get { return this._Id; }
                set
                {
                    if (this.Id != value)
                    {
                        _Id = value;                    
                        OnPropertyChanged("Id");
                        
                    }
                }
            }
            public string Nombre
            {
                get { return this._Nombre; }
                set
                {
                    if (this.Nombre != value)
                    {
                        _Nombre = value;
                        OnPropertyChanged("Nombre");
                    }
                }
            }
    
            public string Telefono { get; set; }
    
            public virtual void OnPropertyChanged(string Propiedad)
            {
                if (this.PropertyChanged != null)
                {                
                    this.PropertyChanged(this, new PropertyChangedEventArgs(Propiedad));
                }
            }
            public event PropertyChangedEventHandler PropertyChanged;
        }
    }
    
    


    El Xaml sería este

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <DataGrid AutoGenerateColumns="true" Height="210" HorizontalAlignment="Left" Margin="18,44,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="421" CellEditEnding="dataGrid1_CellEditEnding" />
        </Grid>
    </Window>
    


    Fíjate en la definición de la clase y la implementación de INotifyPropertyChanged eso es lo que hace que se refresque el valor de la columna Nombre.

    De todas formas no me gusta esta forma de hacer las cosas, si trabajas en WPF, Silverlight o Windows Phone 7 te debes de plantear muy seriamente implementar el patron MVVM, aquí tienes un framework bastante utilizado http://mvvmlight.codeplex.com/.

    Eso por una parte y por otra yo separaría funcionalidades en un Formulario tendría la vista del Grid, sin edición y en otro la edición del registro, Es decir la búsqueda la haría en este último.

    Saludos,


    phurtado
    • Marked as answer by jesl Wednesday, November 02, 2011 12:35 AM
    Saturday, October 29, 2011 8:01 PM
  • hola

    si suas dataset tipados

    Show Data in WPF DataGrid using DataSet data template

    el punto importante es cuando vincula los datos al control en el metodo FillCustomers() all veras que despeus de cargar el datatable mediante el tableadapter lo asigna al DataContext pero ojo porque es del windows que lo hace

    recuerda que puede asignar los datos de distintas formas

    WPF - Binding DataTable to a WPF Datagrid

    puede hacerlo al ItemSource o al DataContext, veras que al usar el DataContext se define el path del root desde donde bindea los datos

    <Grid  Name="_maingrid"> 
        <dtgrd:DataGrid  
                         x:Name="_dataGrid"
                         ItemsSource="{Binding Path=.}"  
                         ColumnHeaderHeight="25"
                         AutoGenerateColumns="True"  
                              > 
        </dtgrd:DataGrid>
    </Grid>

     

    aunque creo que en tu caso usar el Itemsource seria lo mejor

    DataGrid in WPF

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Saturday, October 29, 2011 8:32 PM
  • Este es el Datagrid en XAML

    <DataGrid Name="dgProductos">
     <DataGrid.Columns>
             <DataGridTextColumn Header="Alm"/>
                    <DataGridTextColumn Header="Cve. Prod." Width="150" />
                    <DataGridTextColumn Header="Nombre" Width="424"/>
                    <DataGridTextColumn Header="Cantidad" Width="150"/>
                    <DataGridTextColumn Header="Precio" Width="150"/>
                    <DataGridTextColumn Header="% D" Width="100"/>
                    <DataGridTextColumn Header="Importe" Width="180"/>
             </DataGrid.Columns>
    </DataGrid>

    Tengo dos Clases con las cuales les hare el Binding
    FacturaCuerpo y FacturaDetalle en esta metere todos los productos.

    Como le hago para inciar la captura de datos atraves del teclado ejemplo:
    ________________________________________________________________

    Almacen| Cve. Prod.| Nombre    |Cantidad| Precio  |% D| Importe|
    ________________________________________________________________

    1          81 2 1...enter buscar nombre y precio y ponerlo en las columnas respectivas.......

    Cuando despliego la ventana de captura de factura el datagrid gdProductos no tiene ningun renglon para comenzar
    la captura esa es mi duda como puedo hacerle para deplegar al menos 10 renglones para la captura de datos desde
    el teclado? ya conforme el usuario vaya capturando lanzare los eventos necesarios para la consulta.

    Si los voy a enlazar a las clases que tengo destinadas para eso por ahorita lo que me interesa es como hago
    la captura de datos.....

    Disculpa mi ignorancia pero ya estoy un poco aturdido con esto y desesperado.
    gracias!!

    Sunday, October 30, 2011 5:49 PM
  • ojo porque si defines las columnas en el xaml debes especificar la propiedad Binding

    <DataGridTextColumn Header="Cve. Prod." Width="150" Binding={Binding Path=NombrePropiedad} />

    sino ahces esto no sabra que campo debe ubicar alli

     

    no tiene ningun renglon para comenzar  la captura esa es mi duda como puedo hacerle para deplegar al menos 10 renglones para la captura de datos desde el teclado?

    es que en realidad deberia poner textbox y controles por fuera del grid que permita ingresar la informacion y un boton de "agregar" que vuleque los datos de estos controles a un registro que luego se visualizara en el datagrid

    porque intentas realizar esta operacion directa en el grid cuando esto es mas complejo

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Sunday, October 30, 2011 6:57 PM
  • XALM
    <DataGrid Name="dgProductos" ItemsSource="{Binding}">
     <DataGrid.Columns>
             <DataGridTextColumn Header="Alm" Binding="{Binding Path=FacturaConsultada.Articulos.IdAlmacen}"/>
                    <DataGridTextColumn Header="Cve. Prod." Binding="{Binding Path=FacturaConsultada.Articulos.ClaveProducto}" Width="150" />
                    <DataGridTextColumn Header="Nombre" Binding="{Binding Path=FacturaConsultada.Articulos.NombreProducto}" Width="424"/>
                    <DataGridTextColumn Header="Cantidad" Binding="{Binding Path=FacturaConsultada.Articulos.Cantidad}" Width="150"/>
                    <DataGridTextColumn Header="Precio" Binding="{Binding Path=FacturaConsultada.Articulos.Precio}" Width="150"/>
                    <DataGridTextColumn Header="% D" Binding="{Binding Path=FacturaConsultada.Articulos.PorDescuento}" Width="100"/>
                    <DataGridTextColumn Header="Importe" Binding="{Binding Path=FacturaConsultada.Articulos.Importe}" Width="180"/>
            </DataGrid.Columns>
    </DataGrid>

    Con el binding no tengo problema Leandro el problema que tengo es en la captura....

    Codigo detras
    aqui declaro la propiedad con la cual la voy a enlazar

    private Facturacion.FacturaCuerpo _facturaconsultada;
    public Facturacion.FacturaCuerpo FacturaConsultada
    {
     get { return _facturaconsultada; }
            set { _facturaconsultada = value; OnPropertyChanged("FacturaConsultada"); }
    }

     
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        dgProductos.ItemsSource = FacturaConsultada.Articulos;  // es una propiedad list que lleva todo el detalle de la factura
    }

    asi se mira en la imagen

    ahi como le hago para insertar un row en blanco y que el usuario pueda capturar los datos como Alm Cve. Prod, Cantidad y %D para yo poder desplegar los demas datos en las celdas correspondientes. ese es la procedimiento hasta que el usuario ya no tenga mas articulos que capturar.

    Gracias!!

    Monday, October 31, 2011 4:29 PM
  • ahi como le hago para insertar un row en blanco y que el usuario pueda capturar los datos

    no has probado agregar un item al

    FacturaConsultada.Articulos;

    o sea a la coleccion que usas para cargar los registros en el grid es que deberias agregarle el nuevo dato para editarlo en el grid

     

    Con el binding no tengo problema Leandro el problema que tengo es en la captura

    estas seguro? porque no has mostrado ninguna captura en donde se vidualicen registros, haz que

    FacturaConsultada.Articulos;

    devuelva algun registro para validar que puede visualizarlo en el grid, antes de editar debes validar que puede ver datos existentes

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Monday, October 31, 2011 4:33 PM
  • Hola,

    Mira esta linea que muestras

    <DataGridTextColumn Header="Alm" Binding="{Binding Path=FacturaConsultada.Articulos.IdAlmacen}"/>

    Cambiala por esta

    <DataGridTextColumn Header="Alm" Binding="{Binding Path=IdAlmacen}"/>

    Es decir deja todos los binding con el nombre del campo exclusivamente.

    Saludos,


    phurtado
    Monday, October 31, 2011 4:59 PM
  • hola Pedro

    justamente lo que me llamaba la atencion, pero como comento

    Con el binding no tengo problema Leandro el problema que tengo es en la captura

    es que me parece que nunca probo asignar registros existentes para solo visualizarlos en el grid

     

    slaudos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Monday, October 31, 2011 5:10 PM
  • Efectivamente Leandro,

    El Binding lo tiene mal hecho. De todas formas pensando en lo que quiere hacer @jesl lo veo complicado, puesto que lo quiere es hacer un lookup en la base de datos cuando salga de una columna del grid y lo único que se me ocurre es o montas un verdadero follón con eventos del propio DataGrid o a la columna le asigna un ValidationRule y busca en la bb.dd por el valor de la columna, el problema es que hay que montar otro follón, puesto que una vez encontrado el registro, para que refresque los datos lo lógico es pasar al ValidationRule el GridItem.CurrentItem por medio de un DependencyObject con un DependencyProperty. Hasta aquí es lo que yo he visto y pensado, pero creo que difícil.

    Paso un ejemplo por si se anima

    http://www.wpfmentor.com/2009/01/how-to-add-binding-to-property-on.html

     

    La verdad que estaría bien si alguien lo tiene resuelto que lo aporte, puesto que todo lo que he encontrado sobre Lookup WPF se resuelve con Combox y a mí personalmente no me gusta.

    Saludos,

     


    phurtado
    Monday, October 31, 2011 5:27 PM
  • si por ahi lo que plantearia es que no se edite sobre el mismo grid

    sino que se seleccione un registro y se vuelque los datos que este contiene a controles simples, textbox, combos, etc

    que permitan editar la info de ese row seleccionadoa en el grid, cuando se acepta se graban los cambios y se actualzia la info del grid

    creo que es algo bastante mas simple de aplicar

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Monday, October 31, 2011 6:00 PM
  • Si tienes razon no logro que me despliege ningun dato

    teniendo asi el XALM

    <DataGrid Name="dgProductos" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}">
       <DataGrid.Columns>
           <DataGridTextColumn Header="Alm" Binding="{Binding Path=FacturaConsultada.Articulo.IdAlmacen}"/>

    y en el codigo detras asi:

    private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                Facturacion.FacturaCuerpo factura = new Facturacion.FacturaCuerpo();
                Facturacion.FacturaDetalle detalle = new Facturacion.FacturaDetalle();
                detalle.IdAlmacen=1;
                detalle.ClaveProducto="A5543";
                detalle.NombreProducto="LIMPIADOR DE PISO";
                detalle.Cantidad=2;
                detalle.PrecioUnitario = 54;
                detalle.PorDescuento=0;
                detalle.Importe = 108;
                factura.Articulos.Add(detalle);
                FacturaConsultada = factura;
                dgProductos.ItemsSource = FacturaConsultada.Articulos;
            }

     

    Ayuda por favor...

    Monday, October 31, 2011 6:01 PM
  • Hola,

    Pero de verdad quieres quitar esto del Path "FacturaConsultada.Articulo."No le des mas vueltas el problema es ese. Estás haciendo mal el Binding, aunque digas que lo controlas el problema que no te muestre ninguna linea es eso, quítalo y veras como te aparece para intruducir un registro. Hombre haznos caso :)

    Ayuda por favor...

    Deja esta linea así <DataGridTextColumn Header="Alm" Binding="{Binding Path=IdAlmacen}"/> 

     

    Efectivamente Leandro, eso es lo facil y lo que debería de hacer

    Saludos,


    phurtado
    Monday, October 31, 2011 6:10 PM
  • Ya lo he hecho pero sigue el problema no puedo desplegar ningun dato me doy cuenta que el programa  cuando cargo la ventana, en la linea  "factura.Articulos.Add(detalle);" no me marca error pero ya no continua en la siguiente linea
     se las brinca y despliega las ventana sin valor alguno en el datagrid

    private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                Facturacion.FacturaCuerpo factura = new Facturacion.FacturaCuerpo();
                Facturacion.FacturaDetalle detalle = new Facturacion.FacturaDetalle();
                detalle.IdAlmacen=1;
                detalle.ClaveProducto="A5543";
                detalle.NombreProducto="LIMPIADOR DE PISO";
                detalle.Cantidad=2;
                detalle.PrecioUnitario = 54;
                detalle.PorDescuento=0;
                detalle.Importe = 108;
                factura.Articulos.Add(detalle);
                FacturaConsultada = factura;
                dgProductos.ItemsSource = FacturaConsultada.Articulos;
            }

    Monday, October 31, 2011 6:26 PM
  • Hola

    Ya logre meter la informacion al dgProductos.ItemsSource atraves de la propiedad   FacturaConsultada.Articulos y en el XALM cambie la linea

     <DataGridTextColumn Header="Alm" Binding="{Binding Path=IdAlmacen}"/> 

    pero sigue sin mostrar los datos

    Monday, October 31, 2011 8:01 PM
  • ¡Buenas noches!

     

    Hola Leandro y Pedro. Cuando terminéis la explicación (la cuál se agradece) podriáis pasarla al foro de WPF/Silverlight, que es a mi parecer dónde debe de estar. Asi ayudamos a los demás usuarios que tengan la misma inquitud en estas tecnologías. Y por consiguiente, cerrar estas dos entradas que tiene hechas Jesl al respecto: http://social.msdn.microsoft.com/Forums/es-ES/wpfes/thread/69273be5-73b9-4f8e-8acb-90b3c084bcc9 y http://social.msdn.microsoft.com/Forums/es-ES/wpfes/thread/56a877aa-4a52-4ac6-823b-94871d26de0a

     

    Gracias,

     

    Monday, October 31, 2011 8:20 PM
  • Hola Leandro,

    Cierra esta pregunta que ya tiene respuesta en esta http://social.msdn.microsoft.com/Forums/es-ES/wpfes/thread/56a877aa-4a52-4ac6-823b-94871d26de0a.La verdas @jesl, que gracias a que no hay mucha gente como tú en los foros, esto funciona, porque si hubiesen muchos así es para salir corriendo y no volver.

    Te cuento, esta tarde he estado pensando y probando en una solución para que pudieses hacer lookup(que posiblemente no sabes ni lo que es). Me molestan estas situaciones y entiendo que al resto también. Mi pregunta es ¿has aprendido algo? , porque a partir de ahora, cuando vea el nombre @jesl, un servidor no va a contestar más.

    Me da una pena esta frase "Ojala y pueda alguien ayudarme se lo agracedeceria en mucho", pues ya sabes de una persona que no te va ayudar más.

    CorsarioVasco, muy bueno tu apunte, que lo soluciones @jesl y que nos diga como lo ha hecho.

    XC

    Saludos,



    phurtado
    Monday, October 31, 2011 10:23 PM
  • Bueno sin palabras!!! Como que la ayuda no la brindais de forma sincera eso es lo que he aprendido de parte de ustedes dos, por parte de Leandro mis respetos el siempre ha tenido la mejor de las disposiciones por algo es Baufest (Partner, MVP)

    Muchas gracias por su tiempo y que Dios los bendiga siempre

    y si veis por otro lado @jesl no os asusteis solo sigue tu camino

     

    Monday, October 31, 2011 11:06 PM
  • Hola,

    Como que la ayuda no la brindais de forma sincera eso es lo que he aprendido de parte de ustedes dos

    La brindamos a todo el mundo, y creo que muchas veces bien, otras veces como humanos seguro que nos equivocamos, corregimos e intentamos aportar. 

    Mira te cuento desde el sábado, 29 de octubre de 2011 20:01 te pasé una solución para mi mala y te lo advertí, te parece lógico lo que has hecho preguntar en tres sitios lo mismo y no solucionar nada,  tu que piensas que nuestro tiempo no tiene valor, que pasa tu te sientes con derecho a sentirte ofendido y nosotros no, es decir nosotros ayudamos tu no dejas las cosas claras, entras por diferentes sitios, no haces ni puñetero caso y ademas te ofendes, pues chico continua que esta noche voy a dormir tranquilo. Con otra persona quizás no, pero después de lo que estoy viendo contigo te prometo que si lo voy a hacer, dormir y dormir.

    Saludos,



    phurtado
    Monday, October 31, 2011 11:19 PM
  • jesl, Pedro

    estaba interesante el hilo lastima que tomara este matiz tirante

    jesl sin intencion de justificar a Pedro queria comentarte dos puntos que pueden ser causaron su enojo, de esta forma comprendes del porque esos comentarios que realizo

     

    - el primero punto se relaciona seguramente por desconocimiento has implementado una practica no muy bien vista en el ambito de los foros, se trata de Cross Post, o sea realziar la misma pregunta en distintos foros manteniendo interacciones separadas, esto no es bien visto y cuando se descubre genera cierto enojo

    sumado a que en el otro foro has marcado uan propuesta como aceptada cuando aqui no has tomado un camino, esto genera ciertas preguntas de que alterntivas estas optando para solucionar el problema  ysi la ayuda brindada te resulta util o si se esta perdiendo el tiempo porque ya has encontrado uan solucion en otro lado que no comentas aqui

    las buenas practicas en un foro dicen que debes consultar en un solo foro, cuando pase un tienmpo que veas nadie responde o ayuda a encontrar uan solucion, ahi si realiza la misma pregunta en otro foro, pero pon el link del anterior, asi se puede realizar el tracking, es asi como deberias haber procedido

     

     

    - el segundo punto se relaciona a que no se observa en este hilo que estes tomando una camino para resolver el problema, se plantean ejemplos, alternativas, pero no decides por cual ir o aportas algun avance en el tema, dices que el binging no es un problema pero resulta que los registros no ash podido cargarlos, lo cual confunde y no se sebe si avanzas o estas retrocediendo. Esto sumado a que has cerrado en otro foro una propuesta de solucion, uno si lo analiza no sabe que pensar, para que seguir aportando ideas sino te van a ser utiles porque ya lo solucionaste

    ten en cuenta que wpf es dificil y lo que planteas lo complica aun mas, quizas deberias plantearte si estas a la altura de conocimiento para encarar esta tecnologia , o necesitas profundizar en capacitacion antes de abordarla

    o quizas como comente simplifica el diseño, no intenttes editar en el mismo grid si esto es complejo, selecciona un item y editalo en controles simples que conoce como programar y luego incializas los controles y recarga el grid para reflejar los cambios

     

    como veras esto sumado y analizado por Pedro despues de generarte ejemplo y brindar la una excelente ayuda, genera cierta frustraccion y malestar que bueno resultaron de sus comentarios hacia ti

    no justifico con esto a ninguna de las partes, solo queria aportar algo de entendimiento

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Tuesday, November 01, 2011 12:20 AM
  • Hola Leandro,

    Si no es justificar a ninguna parte. Mi malestar está claro y lo has descrito a la perfección. La verdad que es algo interesante, no solo para este foro, sino también para el foro de WPF/Silverlight y para cualquier persona que pueda trabajar con estas tecnologías. 

    Es más basándome en el link que aporte http://www.wpfmentor.com/2009/01/how-to-add-binding-to-property-on.html he llegado hasta este punto y cuando dije que estaba calentandome la cabeza así era, puesto que me parecía interesante.

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
            xmlns:local="clr-namespace:WpfApplication1"
            Title="MainWindow" Height="350" Width="525">
        
        
        <Window.DataContext>
            <local:PersonaModelView x:Name="Data"></local:PersonaModelView>
        </Window.DataContext> 
        <Grid>
            <DataGrid AutoGenerateColumns="False" Height="210" HorizontalAlignment="Left" Margin="18,44,0,0" 
                      Name="dataGrid1" VerticalAlignment="Top" Width="421" ItemsSource="{Binding}">
               
               
               
                <DataGrid.Columns>
                    
                    <DataGridTextColumn Width="75" Header="Id">                         
                        <DataGridTextColumn.Binding>                        
                            <Binding Path="Id">
                                <Binding.ValidationRules>
                                    <local:ValidateLookup>
                                        <local:ValidateLookup.LookupCommand>
                                            <local:Lookup Command="{Binding ElementName=Data, Path=Buscar}" Parameter="{Binding ElementName=dataGrid1, Path=CurrentItem}"/>
                                        </local:ValidateLookup.LookupCommand>
                                    </local:ValidateLookup>
                                </Binding.ValidationRules>
                            </Binding>                        
                        </DataGridTextColumn.Binding>                    
                    </DataGridTextColumn>
                    
                    <DataGridTextColumn Width="200" Header="Nombre" Binding="{Binding  Path=Nombre}"></DataGridTextColumn>
                    <DataGridTextColumn Width="200" Header="Telefono" Binding="{Binding Path=Telefono}"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    


    Clases necesarias para implementar MVVM

    public class PersonaModelView
        {
            public PersonaModelView()
            {
                this.Personas = new List<Persona>();
                Buscar = new BuscarRegistro(() => { MessageBox.Show("Hola"); });
            }
            public List<Persona> Personas { get; set; }
            public ICommand Buscar { get; set; }
        }
        public class Persona:INotifyPropertyChanged
        {
    
            public Persona()
            {
                
            }      
            private int _Id;
            private string _Nombre;
            public int Id {
                get { return this._Id; }
                set
                {
                    if (this.Id != value)
                    {
                        _Id = value;                    
                        OnPropertyChanged("Id");
                        
                    }
                }
            }
            public string Nombre
            {
                get { return this._Nombre; }
                set
                {
                    if (this.Nombre != value)
                    {
                        _Nombre = value;
                        OnPropertyChanged("Nombre");
                    }
                }
            }
    
            public string Telefono { get; set; }
    
            public virtual void OnPropertyChanged(string Propiedad)
            {
                if (this.PropertyChanged != null)
                {                
                    this.PropertyChanged(this, new PropertyChangedEventArgs(Propiedad));
                }
            }
            public event PropertyChangedEventHandler PropertyChanged;
    
           
        }
    
        public class BuscarRegistro : ICommand
        {
            private Action _Action = null;
            public BuscarRegistro(Action Action)
            {
                _Action = Action;
            }
            public bool CanExecute(object parameter)
            {
                return true;
            }
    
            public event EventHandler CanExecuteChanged;
    
            public void Execute(object parameter)
            {
                if (_Action != null)
                {
                    _Action();
                }
            }
        }
    
    
        public class ValidateLookup:ValidationRule
        {
    
            public Lookup _LookupCommand;
    
            public Lookup LookupCommand
            {
                get
                {
                    return this._LookupCommand;
                }
    
                set
                {
                    this._LookupCommand = value;
                }
             }
    
            public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
            {
                if ((LookupCommand != null) && LookupCommand.Command!=null)
                {
                    
                }
                return new ValidationResult(true, null);
               
            }
        }
    
        public class Lookup : DependencyObject
        {
            public Lookup()
            {
    
            }
            public ICommand Command
            {
                get { return (ICommand)GetValue(CommandProperty); }
                set { SetValue(CommandProperty, value); }
            }
            public static readonly DependencyProperty CommandProperty =
                DependencyProperty.Register("Command", typeof(ICommand), typeof(Lookup));
    
            public object Parameter
            {
                get
                {
                     return (object)GetValue(ParameterProperty); 
                }
                set
                {
                    SetValue(ParameterProperty,value);
                }
                
            }
            public static readonly DependencyProperty ParameterProperty =
                DependencyProperty.Register("Parameter", typeof(object), typeof(Lookup),new PropertyMetadata());
    
        }
    


    Como puedes observar @jesl,  si que he estado trabajando y muy seriamente en tu problema y si hubieses copiado mi código que pase al principio, hubieses visto perfectamente los dos registros que introduje en la lista de personas.

     

    Pero como meta y para que veas que mi interés no es más que ayudar al resto, voy a seguir investigando en este último camino, puesto que el primero no me gusto porque no implementa MVVM. Así que cuenta con una solución a tu problema, no creo que hoy pero la voy a aportar.

    Saludos,


    phurtado
    Tuesday, November 01, 2011 12:34 AM
  • No sabia el lio que organizaria al meter mi consulta en los dos foros, les ofrezco un disculpa a ambos..seguire intentando

    gracias!

    Tuesday, November 01, 2011 3:16 AM
  • Te ofrezco una disculpa no sabia el lio que iba a liar al hacer lo que hice...

    lo siento

     

    saludos

    Tuesday, November 01, 2011 3:17 AM
  • Pedro

    buenas tardes

     

    Antes que nada te ofrezco una disculpa no me di cuenta del problema tan grande que estaba generando lo siento en verdad te lo digo....

    Ahora tenias razon este primera respuesta daba solicion a mi problema ya la he aplicado es correcta, la marcare como respuesta puesto que es lo correcto..

    Ahora lanzare otra pregunta que esta sera mas interesante puesto que se trata de controlar el datagrid a nivel entrada de datos pasando por el enter y dandole el focus a ciertas celdas...

     

    muchas gracias y de nuevo mil disculpas..

     

    Wednesday, November 02, 2011 12:34 AM
  • Hola Pedro, estoy implementando algo parecido a lo que refieres en el post pero cuando vinculo el DataTable al DataGridView de las 5 columnas del DataTable solamente he podido ver los datos de 2 columnas, las otras 3 no he podido ver los datos de las mismas... que estoy haciendo mal?

    Dirimo Quintero Q.

    Friday, September 20, 2013 7:43 PM