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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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