Deplacer row dans datagridview [Résolu]

olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 8 mars 2008 à 22:11 - Dernière réponse : cs_houba80 12 Messages postés mardi 30 septembre 2008Date d'inscription 10 avril 2013 Dernière intervention
- 20 janv. 2013 à 23:16
Bonjour

Je cherche la methode la plus éléguante de déplacer un row up / down dans un datagridview
Le datagridview est bindé a une datatable

Quelqu'un a une idée ?
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 9 mars 2008 à 11:31
3
Merci
Oui c'était l'idée générale :-)

/*
coq
MVP Visual C#
CoqBlog
*/

Merci cs_coq 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de cs_coq
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 8 mars 2008 à 22:29
0
Merci
Salut,

Une colonne de "rang" sur laquelle est triée la vue ?

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 8 mars 2008 à 22:43
0
Merci
C'est plus subtil

Oui j'ai une colonne de rang sur laquelle je trie la vue (lors du query order by)
Mais je voudrais proposer a l'utilisateur deux boutons up / down

Permettant de déplacer la row selectionnée vers un  rang superieur ou inférieur
Et un peu de magie aussi pour modifier le rang a la volée (mais ca c'est une autre cuisine)
Chemin faisant il peut reorganiser ses assiettes (la tour de hanoi)

Mais je te vois venir ...
Tu pense travailler sur la valeur du rang et retrier a la volée ?
Commenter la réponse de olibara
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 8 mars 2008 à 22:53
0
Merci
Oui, sur une colonne dédiée à cette tâche si nécessaire.
A moins que l'ordre d'affichage n'aie aucune importance pour le restant du traitement, mais de toute façon je ne vois pas d'autre moyen (mais je suis loin de maitriser la personnalisation dece genre de contrôle).

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 9 mars 2008 à 00:52
0
Merci
C'est pas une mauvaise idée !

Je vais creuser
Et si je trouve autre chose je communique !
Commenter la réponse de olibara
olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 9 mars 2008 à 11:23
0
Merci
Salut coq,

J'ai intellectuellement muri ta solution (pas encore vraiment mis en oeuvre)
mais je la trouve plaisante

Car a mon avis ca doit pouvoir marcher avec un DGV bindé
Et que dans les faits on ne fait pas plus ni moins que ce que l'on veut pratiquement faire (changer un ordre de tri)

Et il ne faut pas changer les valeur dans toute la colonne

Exemple

1 toi
2 moi
3 lui
4 pomme
5 poire
6 tomate

Si tu veux remonter pomme sur lui
Tu inverse seulement 2 valeurs pomme=3, lui=4
On retrie et hop !!
Et ainsi de suite
BIEN ENTENDU il faut disabler les tris sur click en colonne header

L'avantage a mon avis (mais il faut essayer) c'est aussi que si on travaille avec un datagridview bindé on pourrais ajouter cette colonne et la traiter indépendemment des data réellement bindées

<!-- / message -->
Commenter la réponse de olibara
olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 9 mars 2008 à 12:08
0
Merci
Salut

Ajout d'une colone non bindée : OK (mais au design, je dois encore digerer comment faire au run time)
Ajout d'un ordinal dans la colonne : OK
Test si la colonne ne perturbe pas le bind OK (jusqu'a la mise a jour utilisant MySqlCommandBuilder)

Maintenant

Je dois organiser le tri sur la colonne et disabler le tri sur les autres : au run time
Je dois definir un comparer pour ma colonne ?
As tu qq conseil
Commenter la réponse de olibara
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 9 mars 2008 à 12:34
0
Merci
Je ne sais pas, je n'ai jamais eu à creuser aussi "profond" quand j'ai eu besoin de ce contrôle.
Par contre logiquement le comparer par défaut, celui pour Int32 en toute logique, devrait suffire.

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 9 mars 2008 à 13:09
0
Merci
Rewind !!

Impossible de trier sur une colonne non bindée

C'est pas grave je truque et je cree une colonne bidon dans mon datasource

Et puis je trie

DGV.Sort(DGV.Columnd[n],ListSortDirection.Ascending)

Mais maintenant, j'aimerais trouver l'indice du current row selectionné histoire de trouver faciliment celui au dessus et celui en dessous (rien n'est simple)
Commenter la réponse de olibara
olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 9 mars 2008 à 14:36
0
Merci
Voila un truc qui marche "presque" bien

J'ai encore un raté inexplicable quand je change de direction (l'avant dernier du sens precédent ne se deplace pas)

Je soumets au yeux des gurus

    private void up_Click(object sender, EventArgs e)
    {
      int i = dgv_ContUpd.CurrentRow.Index;
      int n;
      int.TryParse(dgv_ContUpd.Rows[i].Cells["Xorder"].Value.ToString(),out n);


      dgv_ContUpd.Rows[i].Cells["Xorder"].Value = dgv_ContUpd.Rows[i-1].Cells["Xorder"].Value;
      dgv_ContUpd.Rows[i-1].Cells["Xorder"].Value = n;
      dgv_ContUpd.Sort(dgv_ContUpd.Columns["Xorder"], ListSortDirection.Ascending);
      i--;
      dgv_ContUpd.CurrentCell = dgv_ContUpd[9,i];
    }


    private void dn_Click(object sender, EventArgs e)
    {
      int i = dgv_ContUpd.CurrentRow.Index;
      int n;
      int.TryParse(dgv_ContUpd.Rows[i].Cells["Xorder"].Value.ToString(), out n);


      dgv_ContUpd.Rows[i].Cells["Xorder"].Value = dgv_ContUpd.Rows[i+1].Cells["Xorder"].Value;
      dgv_ContUpd.Rows[i+1].Cells["Xorder"].Value = n;
      dgv_ContUpd.Sort(dgv_ContUpd.Columns["Xorder"], ListSortDirection.Ascending);
      i++;
      dgv_ContUpd.CurrentCell = dgv_ContUpd[9, i];
    }
Commenter la réponse de olibara
cs_houba80 12 Messages postés mardi 30 septembre 2008Date d'inscription 10 avril 2013 Dernière intervention - 20 janv. 2013 à 23:16
0
Merci
Ci dessous un essai qui marche presque bien (après presque 5 ans mais peut etre ça va aider plein d'autres personnes)

// Action pour le boutton UP
int x = dataGridView1.CurrentCell.RowIndex;
if (x == 0)
return;
DataRow row = DT_Lignes.Rows[x];
DataRow rw = DT_Lignes.NewRow();
rw[0] = row[0];
rw[1] = row[1];
DT_Lignes.Rows[x].Delete();
DT_Lignes.Rows.InsertAt(rw, x - 1);
DT_Lignes.AcceptChanges();

// Action pour le boutton Down
int x = dataGridView1.CurrentCell.RowIndex;
if (x == DT_Lignes.Rows.Count)
return;
DataRow row = DT_Lignes.Rows[x];
DataRow rw = DT_Lignes.NewRow();
rw[0] = row[0];
rw[1] = row[1];
DT_Lignes.Rows[x].Delete();
DT_Lignes.Rows.InsertAt(rw, x + 2);
DT_Lignes.AcceptChanges();

J'attend vos commentaires pour améliorer mon script
Commenter la réponse de cs_houba80

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.