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 :

Faire un Find and Replace dans un DataGridView


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Par défaut Faire un Find and Replace dans un DataGridView
    Bonjour,

    J'ai un petit soucis sur une methode de Find and Replace dans un DataGridView. En effet, je parcours les cellules selctionnee et pour chacune d'elles je recherche si la valeure entree est contenue dans la cellule afin d'etre remplacee.

    voici le code de ma methode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void FindAndReplace(string TexteFind, string TexteReplace, DataGridView MonDataGRidView)
    {
        // Pour chaque cellule selectionnee
        foreach (DataGridViewCell MaCellule in MonDataGRidView.SelectedCells)
        {
            // Si ma cellule possede le texte a chercher, je remplace sa value par le texte a remplacer.
            if (MaCellule.FormattedValue.ToString().Contains(TexteFind))
            {
                MaCellule.Value = MaCellule.Value.ToString().Replace(TexteFind, TexteReplace);
            }
        }
    }
    Cela marche bien mais voila le probleme : lorsque je fais un tri sur la colonne dans laquelle je fais mon Find and Replace, a chaque valeur changee, la grille se remet en ordre et je me retrouve avec un decalage. Du coup, certaines cellules ne sont pas mises a jour avec le texte a remplacer...

    Un exemple pour illuster. La colonne NOM est triee par ordre decroissant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           NOM
     
    1     R_IVIO
    2     R_IVIO
    3     R_IVIO
    Apres mon find and replace (Find "IVIO", Replace "IVIP") :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           NOM
     
    1     R_IVIP
    2     R_IVIP
    3     R_IVIO
    Une des valeurs n'est pas remplacee car la methode a suivi cet ordre de cellule:

    Premier passage, c'est la cellule 3 qui est remplacee, puis l'ordre decroissant remis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           NOM
     
    1     R_IVIP    // Cette cellule est passee de l'indice 3 a 1
    2     R_IVIO    // a cause du tri par ordre decroissant
    3     R_IVIO
    Deuxieme passge, c'est la cellule 2 qui est remplacee, puis l'ordre decroissant remis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           NOM
     
    1     R_IVIP    
    2     R_IVIP   // Cette cellule est passee de l'indice 2 a 2
    3     R_IVIO   // a cause du tri par ordre decroissant
    Troisieme passage, c'est la cellule 1 qui est remplacee mais comme l'ordre a change, on retombe sur une cellule deja remplacee, donc aucune modification, fin de la boucle.
    Resultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           NOM
     
    1     R_IVIP    
    2     R_IVIP   
    3     R_IVIO
    Quelqu'un pourrait m'aider a pouvoir remplacer les 3 cellules correctement ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    ...Et si au lieu de faire le tri sur chaque boucle, tu faisais le tri seulement à la fin de ton traitement ?

  3. #3
    Membre éclairé Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Par défaut
    En fait c'est l'utilisateur qui effectue un tri sur la colonne pour mieux voir les cellules a remplacer, puis il en selectionne quelques unes et fait un Find and Replace.

    Je recupere donc un DataGridView deja en mode tri...
    Le tri a chaque passage ans ma boucle est automatique. Je n'ai pas trouve le moyen de la desactiver.

  4. #4
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Citation Envoyé par Contrec Voir le message
    Le tri a chaque passage ans ma boucle est automatique. Je n'ai pas trouve le moyen de la desactiver.
    Hum, bizarre autant qu'étrange...

    Il faut retirer ce tri systématique à chaque passage de boucle, mais sans plus de code, je ne peux pas t'aider.

    As-tu programmé des évènements sur ton DataGridView ?... par exemple un tri sur l'évènement cellValueChanged...

  5. #5
    Membre éclairé Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Par défaut
    Non, je ne touche pas au tri dans mes events de DataGridView. Le dataGridView est en mode "tri par utilisateur" (par defaut me semble t il).

    Si j'essaye de copier d'abord mes SelectedCells dans un Array, elles sont toujours reliees au DataGridView et les index changent. Je suis en train de tester une nouvelle methode :

    Comme le dataGridview est binde avec un DataSet type:

    Je recupere la liste des ID et des Owning column de toute mes SelectedCells.
    Je fais un find sur le dataset a partir des ID puis je met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                            if (MyParameterRow[OwningColumnName].ToString().Contains(TextToFind))
                            {
                                MyParameterRow[OwningColumnName] = MyParameterRow[OwningColumnName].ToString().Replace(TextToFind, TextToReplace);
                            }
    ca fait un peu lourd mais je n'ai trouve que ca, je met le resultat en ligne des que je l'ai

  6. #6
    Membre éclairé Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Par défaut
    Ma solution fonctionne a merveille et ne prend finalement pas plus de ressources. En conclusion: Lorsque l'on travaille sur un DataGridView binde, il est preferable de toucher aux valeurs du DataSet au lieu de s'attaquer directement aux cellules du DataGridView.

    Code : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    public static void FindAndReplaceForParameterGrid(string TextToFind, string TextToReplace, DataGridView ParameterDataGridView, LMA_DataSets.DS_Parameter MyDsParameter)
    {
        // Cree un DataTable pour stocker les valeurs ID et les colonnes des cellules selectionnees
        // passe a travers du tri puisque l'on ne modifie pas de valeur dans cette premiere boucle...
        DataTable SelectedCells = new DataTable("SelectedCells");
        SelectedCells.Columns.Add("PARAMETER_ID", typeof(decimal));
        SelectedCells.Columns.Add("OWNING_COLUMN", typeof(string));
     
        // Remplis ce DataTable avec les bonnes valeurs
        foreach (DataGridViewCell MyCurrentCell in ParameterDataGridView.SelectedCells)
        {
            if (MyCurrentCell.OwningRow.IsNewRow == false)
            {
                DataRow MyNewDataRow = SelectedCells.NewRow();
     
                MyNewDataRow["PARAMETER_ID"] = Convert.ToDecimal(MyCurrentCell.OwningRow.Cells["PARAMETER_ID"].FormattedValue);
                MyNewDataRow["OWNING_COLUMN"] = MyCurrentCell.OwningColumn.Name;
     
                SelectedCells.Rows.Add(MyNewDataRow);
            }
        }
     
        // Parcours du DataTable, pour chaque ligne on recherche la DataRow correspondante dans le DataSet
        // si cette DataRow est trouvee ( != null) on peut faire le find and replace sur elle au lieu de le faire dans le DataGridView
        // Comme le DataGridView est binde avec ce DataSet, toutes les valeurs sont remplacees et automatiquement re-triees pour l'affichage (SUPER)
        foreach (DataRow MyDataRow in SelectedCells.Rows)
        {
            LMA_DataSets.DS_Parameter.T_PARAMETERRow MyParameterRow = MyDsParameter.T_PARAMETER.FindByPARAMETER_ID(Convert.ToDecimal(MyDataRow["PARAMETER_ID"]));
            if (MyParameterRow != null)
            {
                if (MyParameterRow[MyDataRow["OWNING_COLUMN"].ToString()].ToString().Contains(TextToFind))
                {
                    MyParameterRow[MyDataRow["OWNING_COLUMN"].ToString()] = MyParameterRow[MyDataRow["OWNING_COLUMN"].ToString()].ToString().Replace(TextToFind, TextToReplace);
                }
            }
        }
    Au final toutes mes valeurs sont bien remplacees, que le tri soit actif ou non.

    RESOLU youpi

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/05/2010, 20h42
  2. Find and Replace
    Par Newenda dans le forum MATLAB
    Réponses: 2
    Dernier message: 02/06/2009, 15h38
  3. Find and replace sur plusieur fichiers
    Par dazhoid dans le forum MATLAB
    Réponses: 1
    Dernier message: 30/08/2006, 16h18
  4. find and replace dans word
    Par Thargor dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 21/06/2006, 15h01

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