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 :

Recalculer une colonne de datagridview sans être géné par le tri


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut Recalculer une colonne de datagridview sans être géné par le tri
    Bonjour

    J'ai un datagridView qui m'affiche une sélection d'éléments d'une datatable via un filtre sur dataRowView
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DataView dtvCapteurs = new DataView(maConfig.DataSetConfig.Tables["Capteurs"]);
                    dtvCapteurs.RowFilter = "Idperiph = " + dataGridView1.Rows[2].Cells["Idperiph"].Value.ToString();
                    dtvCapteurs.Sort = "Priorité ASC";
    Maintenant je souhaite modifier la priorité des row du datagridview pour 2 choses
    -Toujours avoir la colonne "Priorité" sans doublons (10, 20,30,40,50,60...)
    -Pouvoir remonter ou descendre des lignes dans le datagridView.

    Problème : si je parcours mon datagridview pour recalculer chaque priorité, le tri déplace les lignes en cours de recalcul et du coup cela fausse le calcul
    voici le code de recalcul des "Priorités"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i = dataGridViewCapteurs.Rows.Count; i >0; i--)
                {
                   dataGridViewCapteurs.Rows[i-1].Cells["Priorité"].Value = i * 10 ;
                }
                maConfig.SauvegardeConfig();
    ce code fonctionne en cas d'ajout d'une ligne mais va créer des inversions en cas de retrait de ligne (parce que la première ligne à se faire renommer va se déplacer et ainsi perdre son ordre...

    Y a t-il un moyen de "figer" le datagrid view ? qu'il ne déplace pas les lignes en cours de recalcul des priorités ?

    Merci par avance

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    bonjour

    il serait peut-être plus "logique" de mettre à jour la source de données plutôt que l'afficheur.. comme ça, tu ferais ton opération sur la source
    et ensuite, via un update de la datagridview, tu aurais ta mise à jour...

    Sinon, peut-être que le BeginUpdate() de la dataGridview pourrait répondre à celà

  3. #3
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut
    Bonjour
    Citation Envoyé par theMonz31 Voir le message
    bonjour

    il serait peut-être plus "logique" de mettre à jour la source de données plutôt que l'afficheur.. comme ça, tu ferais ton opération sur la source
    et ensuite, via un update de la datagridview, tu aurais ta mise à jour...
    Je ne comprends pas cette partie de réponse : mon datagriview est bindé à la datatable source, tout changement dans la datagridview est immédiatement répercutée sur la datatable et inversement, non ?
    Pou moi manipuler la datatable source aurait strictement le même comportement, sauf que là je manipule le datagridview parce que j'ai directement accés (QUE) aux enregistrements que je veux manipuler.

  4. #4
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut
    Bonjour

    Je deviens fou ; 2 jours sans trouver de solution et surtout aucune piste, faute de trouver des gens confrontés au même problème...bref il faut surement pas faire comme ca !

    Oublions les colonnes à recalculer, voici le besoin de base :

    J'ai un data set avec 1 table "Capteurs" qui possède un champ "IdCapteur" en numeroauto et un champ "Idperiph" qui correspond à des parents
    Je sélectionne un "periph", et ça m'affiche dans un datagridview bindé à un DataView filtré la liste des "Capteurs" qui ont le bon "IdPeriph".

    L'utilisateur doit pouvoir modifier l'ordre d'affichage des "Capteurs" dans le datagridView pour exprimer un ordre de priorité qu'il veut.
    Ensuite dans une moulinette il me faut pouvoir traiter tous les "Capteurs" dans un ordre strictement égal à l'ordre qu'à défini l'utilisateur.

    Pour cela faut il
    > ajouter une colonne "Priorité" comme j'ai commencé à faire ?(priorité que je n'arrive pas à calculer quand j'ai des ajouts, suppression ou déplacements de lignes)
    > gérer l'index des lignes dans le datarow ? comment gérer la source de donnée du datagridview et surtout son ordre d'affichage dans ce cas ??
    > autre chose ?


    Merci par avance

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Bonjour,

    Je vais te donner les grandes lignes de comment j'aurais abordé le sujet en espérant que cela te donne quelques idées.

    Déjà le binding c'est pas mal du tout, mais de mon expérience perso il faut quand même garder la main sur une partie du système, surtout lorsque l'on veut faire des choses un peu spécial, ou disons plutôt avec un peu fonctionnel...C'est pour ça que, pour ma part, je l'utilise uniquement pour de l'affichage, pour plus de simplicité lorsque je crée mes interfaces.
    Je sépare mes couches, donc j'ai une couche d'accès aux données qui contient les ordres SQL et qui me retourne des listes d'objects (j'ai dans cette couche des DataTable, et rarement des DataSet mais ils ne quittent jamais cette couche), puis je récupère ces listes d'object que je bindes sur les datasources de mes interfaces. L'utilisateur modifie donc les objects bindés à travers l'interface et ensuite je peux redonner soit un object soit une liste d'object à ma couche d'accès aux données, qui va pouvoir faire les modifs en base de données.
    Ca c'est le grand principe, j'ai aussi un petit système sur mes objects métiers qui me permets de savoir directement si mon object a été modifié, et donc si je dois l'insert l'update le delete ou ne rien faire, mais c'est un autre sujet...

    Donc dans ton cas j'aurais une classe Capteurs avec une propriété genre NumOrdre, c'est celle la que l'utilisateur devra modifier pour donner l'ordre de traitement des capteurs.
    La difficultés sera donc la, faire une interface simple et fonctionnel qui te permet de définir le numéro d'ordre de traitement de tes capteurs. Pourquoi pas commencer par un truc simple :
    une datagridview avec tous les capteurs d'affichés, a coté tu as un usercontrol qui affiche les infos du capteur selectionné dans la datagridview, avec dedans une textBox ou tu peux saisir son numéro d'ordre.
    Résultat une fois ça en place tu pourras déjà modifier tes object Capteurs et donc ensuite trier ta liste de capteur ... Ici on sera déjà pas mal, ensuite à toi de gérer la saisir des numéros d'ordre en refusant un numero déjà utilisé, ou pas ... etc bref améliorer l'expérience utilisatrice ... mais ton fonctionnel devrait être en place.

    Bon code,
    J@ck.

  6. #6
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut
    Bonjour et merci

    la modification des "capteurs" ne se fait pas directement dans le datagridview aujourd'hui mais dans un formulaire que je charge sur double click dans le datagridview et qui va enregistrer dans les datatable (la fameuse couche métier si je comprends bien). Ici effectivement j'ai mon champ priorité que je peux changer à volonté sans mon soucis de tri (mis à part que je peux avoir des doublons de priorité et donc ne plus être en capacité de trier).
    La modif des capteurs ne se fait pas directement dans le datagridView parce que les saisies sont un peu complexes avec des treeview de sélection, des tableaux, des combobox, une sorte de wizard en gros.

    le hic c'est que pour des raisons d'ergonomie justement il y a 1 truc que l'utilisateur aurait à faire dans le datagridview : le changement de priorité... si l'utilisateur devait ouvrir chaque ligne pour changer la priorité, sans avoir la visibilité de la priorité des autres capteurs ce serait l'enfer ; c'est pour ça que je prévois une flèche up et une down pour faire monter ou descendre les lignes.

    Et donc c'est là que ça coince, je ne peux pas passer par le couche métier qui traite 1 ligne... ou alors j'ai rien compris à la réponse

    Merci

Discussions similaires

  1. Réponses: 5
    Dernier message: 24/08/2008, 22h25
  2. Réponses: 10
    Dernier message: 29/05/2008, 18h14
  3. Réponses: 1
    Dernier message: 26/10/2007, 18h57
  4. Comment rendre invisible une colonne de datagridview
    Par frederix quest dans le forum Windows Forms
    Réponses: 7
    Dernier message: 21/05/2007, 18h12
  5. [VB.NET] Comment ajouter une colonne à un DataGridView ?
    Par Tarteens dans le forum Windows Forms
    Réponses: 3
    Dernier message: 22/05/2006, 18h32

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