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

C# Discussion :

Copie d'un DataView


Sujet :

C#

  1. #1
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut Copie d'un DataView
    Bonjour,

    Ce n'est pas vraiment un problème mais plus une question; voici le code suivant :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    DataView temp = new DataView();
     
    temp = this.dv_dataview;
     
    if (this.b_etat)
    {              
        temp.RowFilter = "Etat > 0";
    }
    else
    {
        temp.RowFilter = String.Format("IdEvenement > {0}", (dv_dataview.Count - 100));
     
    }
     
    temp.Table.Columns.Remove("Serveur");
    temp.Table.Columns.Remove("Prog");
    temp.Table.Columns.Remove("IdEvenement");
     
    return temp;

    Donc temp recoit en théorie uen copie de dv_dataview. Or lorsque, par exemple, je filtre sur les 100 premiers éléments dans temp, il le filtre aussi dans dv_dataview comme si, les deux variables pointaient sur le même objet. Es-ce un comportement normal ? Comment faire pour réaliser une Copie simple ?

    Sachant que si je fais ça, ca fonctionne nikel, mes filtres n'affecte plus mon DataView dv_dataview :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    DataTable test = new DataTable();
    test = this.dv_dataview.ToTable();
     
    DataView temp = new DataView(test);
     
    if (this.b_etat)
    {
        temp.RowFilter = "Etat > 0";
    }
    else
    {
        temp.RowFilter = String.Format("IdEvenement > {0}", (dv_dataview.Count - 100));
     
    }
     
    temp.Table.Columns.Remove("Serveur");
    temp.Table.Columns.Remove("Prog");
    temp.Table.Columns.Remove("IdEvenement");
     
    return temp;

    Es-ce normal pour réaliser une copie de DataView de passer par un DataTable ?

    Merci.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    DataView n'est pas un type par valeur mais par référence !

    Cela signifie entre autre que quand tu écris ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DataView temp = new DataView();
     
    temp = this.dv_dataview;
    temp n'est pas une copie de dv_dataview, mais est dv_dataview... lorsque l'on manipule des types par référence, on ne manipule que leur référence, si tu préfère leur adresse, pas l'instance elle même.
    par conséquent écrire temp=dv_dataview
    signifie que dans temp tu met la référence de dv_dataview...
    cela signifie que l'objet que tu as instancier à la ligne au dessus est déréférencé et donc détruit, et que temp va donc manipuler directement dv_dataview.

    Pour faire une copie il faut le faire à l'ancienne en copiant cellule par cellule à moins que DataView ne dispose d'un constructeur de copie en provenance d'un autre dataview ou dataset...

  3. #3
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    D'accord, merci pour ces précisions, j'avais en effet l'impression que les deux pointaient à la même adresse.

    Pour ma part, comme tu as du le voir la copie est réalisé à travers un DataTable, je me demande quand même si c'est pas un peu lourd.

    Comme je pars d'une case a coché, censé affecter des filtres différents, je n'aimerais pas rechargé le DataView à chaque fois mais le garder et le "copier" à travers une variable temporaire qui affichera les résultats.

    Je vais quand même essayer la copie à "l'ancienne" pour voir la différence de temps.

    Merci encore !

  4. #4
    Membre émérite Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Par défaut
    BOnjour,
    tu peux faire DataView.ToTable()

  5. #5
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    Salut,

    merci, mais comme tu peux le lire dans mon premeir message c'est exactement ce que j'ai fais. Pour faire ma copie je passe par un DataTable. Je vais voir s'il n'y a pas moins lourd.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    pose toi la question réelle de savoir si il est nécessaire de faire une copie de ton DataView...

    il faudrait peut-être simplement revoir ton scénario, et utiliser une autre approche de ton problème, car de toute façon, copier un DataView/DataTable, c'est copier un tableau en 2 dimensions... peut importe l'algorithme, cela reste toujours du O(n²).
    en effet un algorithme de recherche peut être optimisé, mais la copie scrute chaque cellule et il n'y a pas moyen d'y couper.

  7. #7
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    Oui c'est sur. Mais je charge le DataView une fois. Ensuite à chaque fois que je coche la case, l'un des deux filtres est appliqué. Dans le cas ou je ne fais pas de copie, je dois à chaque fois recréer le DataView et donc faire appel à la requête, la charger dans le DataSet... Puis ensuite de réappliquer les filtres.

    Je me demande donc si la copie n'est pas la meilleure solution. Mais oui il faut quand même que je réfléchisse à une autre implémentation, je suis bien conscient que la copie est lourde.

  8. #8
    Membre émérite Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Par défaut
    Citation Envoyé par obito Voir le message
    Ensuite à chaque fois que je coche la case, l'un des deux filtres est appliqué. Dans le cas ou je ne fais pas de copie, je dois à chaque fois recréer le DataView et donc faire appel à la requête, la charger dans le DataSet... Puis ensuite de réappliquer les filtres.
    tu n'es pas obligé, tu n'as qu'a définir ton DataView une seul fois, et jouer avec les filtre en changer la propriété RowFilter de ton DataView.

  9. #9
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    Ha oui mais la est l'astuce. Si je demande de n'afficher que les 100 premières lignes UNE fois, aucun problème, il m'affichera bien mes 100 premières lignes. En revanche si un peu plus tard je recoche la case, la il m'affichera tout pourquoi ? Car mon filtre est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dv_dataview.RowFilter = String.Format("IdEvenement > {0}", (dv_dataview.Count - 100));
    Sauf que... Le COUNT vaut désormais 100 et non pas 1400 par exemple au départ. Lorsque j'applique un filtre sur un DataView, cela affecte le DataView lui même et je n'arrive pas à retrouver la valeur de départ du DataView.

  10. #10
    Membre émérite Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Par défaut
    récupère le Count de ton DataView avant d'appliquer le nouveau filtre, ou bien Clone ton objet DataView.

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    au risque de passer pour un idiot tu développe sur quelle plateforme là ?

    client lourd sous console/windows forms/wpf ?
    client RIA sous Silverlight

    ou site web ASP.NET ?

    Car ton problème ne relève pas du langage mais plutôt de la plateforme... il serait peut-être plus judicieux de mieux le classer... histoire de savoir de quoi on parle.

  12. #12
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    Oui en effet, je suis en WPF. Ma case à coché est bindé en mode TwoWay avec ma propriété de type booléen "b_etat". J'ai un GridView affichant les résultats (donc qui est bindé à ce que renvoi temp). Lorsque je coche, je filtre sur l'etat qui doit être > 0, si je décoche ca sera juste les 100 premières lignes.

    Le code que j'ai mis plus haut se trouve donc dans mon ViewModel.

    Si je n'ai pas mis ce sujet dans le coin WPF, c'est parce qu'au départ ma question concernait essentiellement la copie de DataView, ce qui me paraissait être plus propre au framework lui même qu'à la technologie employée ^^

  13. #13
    Membre expérimenté
    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
    Par défaut
    J'ai pas vraiment bien suivi ni bien compris ce que tu veux faire

    Mais ta solution ne serait-elle pas d'avoir plusieurs dataview avec des filtres différents sur la meme table ?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/05/2012, 20h16
  2. Protéger une disquette contre la copie
    Par benzaza dans le forum Assembleur
    Réponses: 20
    Dernier message: 16/01/2005, 10h42
  3. Copier et afficher une copie d'ecran
    Par Bobx dans le forum Langage
    Réponses: 6
    Dernier message: 02/08/2002, 22h20
  4. Copie de fichier
    Par Bjorn dans le forum C
    Réponses: 4
    Dernier message: 11/06/2002, 15h23
  5. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20

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