IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Filtrer une dataTable sur une colonne


Sujet :

Windows Forms

  1. #1
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut Filtrer une dataTable sur une colonne
    Bonjour !

    je développe avec VS2008, en C# Windows forms.
    J'ai une dataTable remplie au préalable, et source d'un dataGridView.

    Suite à une action de l'utilisateur, la liste contenue dans la table (une liste de pièces d'échafaudages ^^) est mise à jour, la colonne 'Quantité' est modifiée pour certaines pièces.
    Suite à cette modif des quantitées, j'aimerais créé une vue de cette table ne contenant que les lignes dont la quantité est supérieur à 0...

    y'a -t-il un outil simple pour cela ? j'ai commencé à regarder la 'defaultView' de ma dataTable, mais j'ai un peu du mal...
    Donc si vous avez une solution ou un lien d'un bon tuto sur les dataTable en C# je suis preneur ! =)

    merci

    "- Mais à quoi ça sert IE ?
    - à télécharger Firefox ! "

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    tu souhaite affiché les enregistrement dont la quantité est à 0 dans la même grid ou dans une autre?

    Si c'est dans la même grid utilise datatable.defautView.RowFilter.

    Si tu veux l'afficher dans une autre grille il va falloir créer une autre dataTable et y mettre les lignes que tu souhaites afficher puis la mettre en datasource de ta 2eme grille.

  3. #3
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    deja, merci pour ta réponse =)

    et je ne souhaite pas afficher les éléments dont la quantité est à 0... ils le sont juste à l'ouverture du formulaire, et les actions (dans un autre form ouvert ensuite) de l'utilisateur modifie les quantités des éléments. Les modif arrivent toutes en même temps, pour ca y'a pas de soucis à priori...

    ce que je veux, c'est obtenir une vue (ou une table) contenant les lignes où la quantité est supérieur à 0.

    EDIT :
    je suis en train de bosser dessus, j'avance un peu grâce à msdn (ici) mais je bloque car ma quantité est dans une colonne du DataGridView que j'ajoute en code... et donc pas présente dans ma DataTable
    J'ai voulu l'ajouté à ma table et/ou à ma vue, j'ai une erreur
    Impossible d'ajouter ou de supprimer des colonnes à partir de la table une fois que le DataSet est mappé à un document XML chargé
    donc j'ai voulu détourner ca en mettant d'abord comme DataSource de mon grid une 'copy' ou un 'clone' de ma table, mais ca me retourne la même erreur...

    "- Mais à quoi ça sert IE ?
    - à télécharger Firefox ! "

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    tu utilises le générateur de dataset de VS ?

  5. #5
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    non, je n'ai même pas de dataSet défini, je ne créé qu'une dataTable...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DataTable dt_multicrab; //table de base
    dt_multicrab = om_Pièce.ChargerTable();  //je charge la table depuis mon fichier xml
    DataTable dt_temp = new DataTable();  //définition d'une table temporaire
    dt_temp = dt_multicrab.Clone();  //je lui attribue un clone de ma table 
    this.dgw_Pièces.DataSource = dt_temp;
    edit : j'ai essayé de définir le dataSource du gridView à null, ca ne change rien...

    l'erreur se produit lorsque j'ajoute une colonne à ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dt_multicrab.Columns.Add(MonNomdeColonne);

    "- Mais à quoi ça sert IE ?
    - à télécharger Firefox ! "

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    essai comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dt_multicrab.Columns.Add("Qté",typeof(int));

  7. #7
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    marche pas non plus...
    par contre ca m'a fait comprendre que je ne cherchais pas dans le bon sens >< je pensais le problème comme venant du lien entre dataGrid et table, en fait c'est entre table et fichier xml...

    donc... du coup le clone() et l'ajout d'une colonne à la table clonée, ca fonctione ... presque !
    maintenant sur cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dt_temp.Columns.Add(NomColonne, typeof(string));
    j'ai cette erreur :
    Impossible d'ajouter une relation imbriquée ou une colonne d'éléments à une table contenant une colonne SimpleContent
    une idée de ce que signifie cette erreur et de comment la corriger ?

    "- Mais à quoi ça sert IE ?
    - à télécharger Firefox ! "

  8. #8
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut filtrer une colonne de DataGridView
    bon, pour me simplifier la vie j'ai donné comme DataSource à mon grdiView une List<> d'objets de l'une de mes classes, donc ca fonctionne tout nickel !

    sauf que je n'arrive toujours pas à filtrer mes lignes dans le DataGridView en fonction de mes valeurs d'une des colonnes...
    un peu d'aide svp

    "- Mais à quoi ça sert IE ?
    - à télécharger Firefox ! "

  9. #9
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    De mémoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyDataGridView.BindingSource.Filter=MyColumnName+">0"
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  10. #10
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    Citation Envoyé par Graffito Voir le message
    De mémoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyDataGridView.BindingSource.Filter=MyColumnName+">0"
    Merci de ta réponse Graffito, mais non...
    j'ai fait quelques recherches et tests, en fait ton code est bon dans le cas où le dataGridView est bindé à une dataTable, et le filter se fait directement sur la dataTable ou une vue de cette table...
    Ici, la source de mon dataGridView est une List<> d'objets

    "- Mais à quoi ça sert IE ?
    - à télécharger Firefox ! "

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Points : 140
    Points
    140
    Par défaut
    Bonjour,

    Pourquoi ne pas utiliser un objet qui implémente IBindingListView (du système si tu en trouve un, ou un maison) pour faire ton filter au lieu d'une List<> ?

    PS : après relecture du msdn, il y a le BindingSource comme objet.
    http://msdn.microsoft.com/en-us/libr...ingsource.aspx

  12. #12
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    je suis assez peu (voir pas du tout..) compétent avec les classes I... à réécrire etc... (faille à combler quand j'aurai un peu de temps...)

    par contre depuis hier, j'ai pu régler un certains nombres de problèmes que je rencontrais, donc je vais voir si malgré tout, je ne peux pas rebasculer en DataTable comme DataSource, le Filter me simplifierait grandement la vie !
    D'autant qu'il faut que je prévois pour mon GridView la possibilité d'autoComplétion sur recherche d'un item... et la aussi la dataTable me serait bien utile !

    je travail sur tout ca et je reviens vous donner les résultats ^^
    Mais si quelqu'un veut me proposer une solution de filtre avec une List<>, je suis toujours preneur

    "- Mais à quoi ça sert IE ?
    - à télécharger Firefox ! "

  13. #13
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Je ne comprends pas bien

    A la base tu travaillais avec une table
    Il aurait suffit de definir un dataview sur cette table

    Et puis tu a changé cette table en liste mais ca n'a pas résolu ton problème

    Ne peux-tu pas essayer le dataview a partir d'une datatable ?

    Et tu bind le dataview sur ton DataGridView
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  14. #14
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    c'est vrai que ca parait pas très clair... je vais ré expliquer de facon plus construite ^^

    en gros, je gère une liste de Structures (échafaudages), chaque structure possède une liste de matos nécessaire pour la construire...
    mon DataGridView à pour fonction de faire le listing des pièces (ref, libellé, poids etc...) et le nombre nécessaire par structure + un total

    du coup, si je bind à une table, je dois rajouter en code les colonnes de décompte des pièces (une par structure ) et la colonne du total... et par conséquent, ca m'empêche le filtre sur la table puisque je veux filtrer sur le total (conserver que les lignes des pièces avec un total >0 ) et cette colonne ne fait pas partie de ma table, mais du gridview... ><

    si je bind sur une List<> d'objets (de ma classe "Pieces") j'ai une colonne Total intégrée, mais je ne sais pas créé un filtre dessus
    et je rajoute toujours en code une colonne pour chaque structure créée par l'utilisateur...

    En espérant avoir été clair cette fois...
    donc je préférerai une solution avec ma List<Piece>, mais j'accepte tout !

    "- Mais à quoi ça sert IE ?
    - à télécharger Firefox ! "

  15. #15
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Hello,

    ton problème est assez ancien, chez les C#istes. Ce qui ne le rend pas non pertinent, bien au contraire
    cf par exemple : http://www.developpez.net/forums/d19...inding-avance/

    Le binding laisse un goût d'inachevé avec les winforms, le filtrage étant très (mais alors très très) demandé par les clients d'un application grillo-centrée.

    J'utilise personnellement une implémentation de IBindingListView, trouvée ici (on peut la trouver aussi .)
    Ca marche nickel.
    ಠ_ಠ

  16. #16
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Cette colonne ne fait pas partie de ma table
    Et pourquoi tu n'ajoute pas une colonne a ta table pour y mettre le Total

    Je suppose que c'est ce que tu fais avec les éléments de ta liste ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  17. #17
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    Citation Envoyé par olibara Voir le message
    Et pourquoi tu n'ajoute pas une colonne a ta table pour y mettre le Total

    Je suppose que c'est ce que tu fais avec les éléments de ta liste ?
    tout simplement parce que ma table est chargée depuis un fichier XML, et que du coup je me retrouve avec cette erreur ci :
    Citation Envoyé par beren.kei Voir le message
    Impossible d'ajouter ou de supprimer des colonnes à partir de la table une fois que le DataSet est mappé à un document XML chargé
    et non, pour ma list, le total n'est pas une colonne "rajoutée" mais une propriété de ma classe Piece...

    merci pour toutes vos réponses, je vais me pencher sur les solutions avec une IBindingListView !

    "- Mais à quoi ça sert IE ?
    - à télécharger Firefox ! "

  18. #18
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    en fin de compte, je suis bien resté sur la solution d'une List<>, et pour ce qui est du filtre, je l'ai fait "maison" bien plus rapide !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public Collection Filtrer()
            {
                Collection retour = new Collection();
                foreach (om_Pièce p in this)
                {
                    if (p.Total > 0)
                        retour.Add(p);
                }
                return retour;
            }
    merci pour toutes vos réponses et votre aide !

    "- Mais à quoi ça sert IE ?
    - à télécharger Firefox ! "

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/11/2014, 11h21
  2. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  3. Réponses: 5
    Dernier message: 13/07/2013, 12h24
  4. Réponses: 2
    Dernier message: 18/11/2012, 11h25
  5. Réponses: 4
    Dernier message: 15/10/2009, 13h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo