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 :

Selection programatique d'un ROW de DGV


Sujet :

Windows Forms

  1. #1
    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 Selection programatique d'un ROW de DGV
    Bonjour

    Je me bats avec un datagridview pour remettre le tri en place et reselectionner un row apres un rebinding

    En gros voici le code inclus dans le DataBindingComplete

    Ce qui pose souci c'est que si le DGV doit etre retrié, (SortResult != null)
    Alors le FirstDisplayedScrollingRowIndex ne s'affiche pas
    Dans le if (a > -1) le code est surdimensionné mais reflete mes tentatives désespérées pour trouver le truc

    Ca marche tres bien sans tri !! ??

    Merci aux éclairés qui auraient une idée


    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
         if (SortResult != null)
          {
            DataGridViewColumn clx = DgvResults.Columns[SortResult.SortColumn];
            DgvResults.Sort(clx, SortResult.Direction);
            SortResult = null;
          }
     
          if (curInscrIDRes > -1)
          {
            int a=ToolsForForms.DgvSetRow(DgvResults, "InscrId", curInscrIDRes);
            if (a > -1)
            {
              DgvResults.FirstDisplayedScrollingRowIndex = a;
              DgvResults.Refresh();
              DgvResults.CurrentCell = DgvResults.Rows[a].Cells[0];
              DgvResults.Rows[a].Selected = true;
              DgvResults.FirstDisplayedScrollingRowIndex = a;
              DgvResults.CurrentCell = DgvResults.Rows[a].Cells[0];
            }
            curInscrIDRes = -1;
          }
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  2. #2
    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
    Bonjour

    Je pense avoir trouvé !

    Il semblerait que la mauvaise idée est de vouloir gerer le retri et le positionnement proprement (comme je le pensais) dans le DataBindingComplete

    Le retri force un rebinding et pour une raison encore obscure les choses s'executent bizarement.
    Un cycle de binding apres réassignation de la datasource si le dgv est trié est (selon les labels plus bas)

    A,B,A,B,C,D,B,C

    Je me demande donc si je ne devrais pas extraire completement la reselection d'un row qui ne depends que d'une seule commande
    Par contre je laisserais le tri dans le databindingComplete

    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
    A:   if (SortResult != null)
          {
            DataGridViewColumn clx = DgvResults.Columns[SortResult.SortColumn];
    B:     DgvResults.Sort(clx, SortResult.Direction);
            SortResult = null;
          }
     
    C:    if (curInscrIDRes > -1)
          {
            int a=ToolsForForms.DgvSetRow(DgvResults, "InscrId", curInscrIDRes);
            if (a > -1)
            {
              DgvResults.FirstDisplayedScrollingRowIndex = a;
              DgvResults.Refresh();
              DgvResults.CurrentCell = DgvResults.Rows[a].Cells[0];
              DgvResults.Rows[a].Selected = true;
              DgvResults.FirstDisplayedScrollingRowIndex = a;
              DgvResults.CurrentCell = DgvResults.Rows[a].Cells[0];
            }
            curInscrIDRes = -1;
          }
    D:}
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  3. #3
    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
    Pour me repositionner sur une ligne du DGV lors d'une opération de tri, de filtre ou de (re)binding, j'enregistre les values de la CurrentRow dans un ArrayList avant l'opération, et après je compare les values sauvegardées à celles des rows du DGV. L'opération est immédiate sur quelques dizaines de milliers de rows.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  4. #4
    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
    Citation Envoyé par Graffito Voir le message
    Pour me repositionner sur une ligne du DGV lors d'une opération de tri, de filtre ou de (re)binding, j'enregistre les values de la CurrentRow dans un ArrayList avant l'opération, et après je compare les values sauvegardées à celles des rows du DGV. L'opération est immédiate sur quelques dizaines de milliers de rows.
    Merci Graffito

    C'est ce que je fais aussi, sauf que je dispose d'un ID qui m'evite de devoir utiliser un Arraylist
    Mais le problème n'est pas la !
    La difficulté etait que je voulais remettre le tri en place ET repositionner la row et faire tout cela dans le DataBindingComplete mais le Sort dans le databinding generait un nouveau databinding, d'ou affolement de l'environnement !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  5. #5
    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 usage de pinvoke
    Bonjour,

    Finalement j'ai resolu le probleme en separant les deux operation

    1- Je reassigne le tri dans le DataBindingComplete
    2- Je repositionne la Row APRES l'assignation du datasource du Dgv qui déclenche le DataBindingComplete

    Mais je me demande quand meme si c'est une bonne manière de faire
    Particulierement, est il bon de faire un tri dans le databindingcomplete puisque ce tri va generer un nouvel event databindingcomplete ?

    J'ai lu un article evoquant l'usage du Pinvoke dans le databinding, mais j'avoue ne pas avoir bien compris ce que cela apporte

    http://social.msdn.microsoft.com/For...9-088e88c5af77

    Un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            customersDataGridView.BeginInvoke((MethodInvoker)delegate()
            {
                customersDataGridView.Rows[row].Selected = true;
                customersDataGridView.CurrentCell = customersDataGridView[0, row];
            });
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

Discussions similaires

  1. [Select] Problème de multi rows
    Par WwiloO dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/01/2007, 10h41
  2. pb : multiple rows in singleton select
    Par sillycoder dans le forum SQL
    Réponses: 6
    Dernier message: 12/06/2005, 16h35
  3. Réponses: 2
    Dernier message: 22/02/2005, 17h14
  4. Réponses: 3
    Dernier message: 25/01/2005, 12h31
  5. Mutiple row in singleton select ????? [Important, merci]
    Par SkyDev dans le forum Bases de données
    Réponses: 6
    Dernier message: 20/04/2004, 14h02

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