none
Filtrar un List generico en C# RRS feed

  • Pregunta

  • Esperando que se encuentren Bien queridos amigos, quisiera hacerle una pregunta:

    Soy estudiante de ingeniería y debo hacer una lista con la posibilidad de ingresar, mostrar, filtrar, eliminar y editar datos por Windows Forms.

    Ahora bien, tengo el Ingreso perfecto, los datos los paso a un DataGridView y los muestro a otro Formulario, bien también, y he aquí mi consulta.

    ¿ como puedo buscar un campo en especial dentro del List<T> y pasar este o estos valor a un DataGridView?, me explico, me gustaría que cuando se busque pueda mostrar el resultado trayéndome todos los campos del List<T> al DataGidView.

    Cabe mencionar que no uso base de datos, la información se almacena en memoria hasta que el programa de cierra.

    De ante mano les agradezco su tiempo, Un abrazo.


    • Editado Jhdiazl domingo, 20 de mayo de 2012 22:53
    domingo, 20 de mayo de 2012 22:49

Respuestas

  • ¿ como puedo buscar un campo en especial dentro del List<T> y pasar este o estos valor a un DataGridView?

    buscas puede buscar usando linq, lo cual es portimo cuando trabajas con lista

    ahora bien magia la consulta no hace, si defines una List<> debes conocer de que tipo estas trabajando para armar la query, porque es como trabajar con sql, sino conoces la estructura de la tabla que consulta puedes hacer, ninguna

    o sea si trabjas con un List<Empleado> podrias consultar y filtrar por las propiedades de este

    ahora si es un List<Articulo> no puedes usar la conaulta del empleado, tienes que diseñar otra distinta porque las propiedades cambian

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta Jhdiazl lunes, 21 de mayo de 2012 5:12
    lunes, 21 de mayo de 2012 3:17
  • Esto es interesante pues un filtro normalmente no elimina registros, sino que simplemente los esconde.  Yo creo entonces que la forma más completa de hacerlo es implementando la interfase IListSource.  El método GetList() devolvería el IList original.  Dicho objeto tendría que implementar IBindingList y IRaiseItemChangedEvents para completar el proceso.  Con estas interfases en su lugar, la colección puede informarle al DataGridView que los elementos de la lista cambiaron mediante el evento ListChanged y un objeto ListChangedEventArgs con su propiedad ListChangeType igual a ListChangeType.Reset.  Finalmente el objeto estaría listo para filtrar (todo lo anterior es únicamente para tomar ventaja del mecanismo de data binding desde su propio objeto).  Ahora este objeto también implementaría uno o más métodos Filter() de su propia creación que filtrarían los datos a mostrar.

    Para facilitar los filtros, la clase de objeto almacenada debería implementar una o más interfases IEquatable<T>, donde T sería el tipo de uno o más de sus propiedades clave.  Esto haría más fácil la creación de filtros "igual a".

    En fin, no es tarea trivial aún para los que sabemos cómo funciona el mecanismo de data binding de Windows Forms, así que trate de seguir el consejo y haga preguntas en el foro si necesita más ayuda.

    Eso sí, también le recuerdo que hay objetos que ayudan a hacer data binding, como los BindingSource.  Los he usado muy poco, pero podrían simplificarle los primeros pasos.  Eso sí, necesita usted como mínimo implementar INotifyPropertyChanged en la clase base que representa los registros del DGV si quiere poder notificar las actualizaciones de items en "tiempo real".


    Jose R. MCP

    • Marcado como respuesta Jhdiazl lunes, 21 de mayo de 2012 5:12
    lunes, 21 de mayo de 2012 3:27
    Moderador

Todas las respuestas

  • ¿ como puedo buscar un campo en especial dentro del List<T> y pasar este o estos valor a un DataGridView?

    buscas puede buscar usando linq, lo cual es portimo cuando trabajas con lista

    ahora bien magia la consulta no hace, si defines una List<> debes conocer de que tipo estas trabajando para armar la query, porque es como trabajar con sql, sino conoces la estructura de la tabla que consulta puedes hacer, ninguna

    o sea si trabjas con un List<Empleado> podrias consultar y filtrar por las propiedades de este

    ahora si es un List<Articulo> no puedes usar la conaulta del empleado, tienes que diseñar otra distinta porque las propiedades cambian

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta Jhdiazl lunes, 21 de mayo de 2012 5:12
    lunes, 21 de mayo de 2012 3:17
  • Esto es interesante pues un filtro normalmente no elimina registros, sino que simplemente los esconde.  Yo creo entonces que la forma más completa de hacerlo es implementando la interfase IListSource.  El método GetList() devolvería el IList original.  Dicho objeto tendría que implementar IBindingList y IRaiseItemChangedEvents para completar el proceso.  Con estas interfases en su lugar, la colección puede informarle al DataGridView que los elementos de la lista cambiaron mediante el evento ListChanged y un objeto ListChangedEventArgs con su propiedad ListChangeType igual a ListChangeType.Reset.  Finalmente el objeto estaría listo para filtrar (todo lo anterior es únicamente para tomar ventaja del mecanismo de data binding desde su propio objeto).  Ahora este objeto también implementaría uno o más métodos Filter() de su propia creación que filtrarían los datos a mostrar.

    Para facilitar los filtros, la clase de objeto almacenada debería implementar una o más interfases IEquatable<T>, donde T sería el tipo de uno o más de sus propiedades clave.  Esto haría más fácil la creación de filtros "igual a".

    En fin, no es tarea trivial aún para los que sabemos cómo funciona el mecanismo de data binding de Windows Forms, así que trate de seguir el consejo y haga preguntas en el foro si necesita más ayuda.

    Eso sí, también le recuerdo que hay objetos que ayudan a hacer data binding, como los BindingSource.  Los he usado muy poco, pero podrían simplificarle los primeros pasos.  Eso sí, necesita usted como mínimo implementar INotifyPropertyChanged en la clase base que representa los registros del DGV si quiere poder notificar las actualizaciones de items en "tiempo real".


    Jose R. MCP

    • Marcado como respuesta Jhdiazl lunes, 21 de mayo de 2012 5:12
    lunes, 21 de mayo de 2012 3:27
    Moderador