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 ?
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 ?
J'ai eu ce besoin justement très récemment et j'ai posé cette même question et n'ai pas eu vraiment de réponse...
Voici le lien vers ce post avec la solution que j'ai trouvé : post 504201
Si tu trouve une solution plus élégante je suis preneur
Si tu a lié ton DGV avec un bindingsource
Si tu a ajouté dans ta datatable une colonne de valeurs disons un integer ordinal
Tu a setté le sort du binding source sur cette colonne (qui a mon avis peut etre cachée dans le dgv)
Up et Down et tu swape les valeurs
J'ai pas essayé mais je trouve l'idée amusante
J'ai bricolé un petit test et ca semble bien marché
Bien entendu il ne faut pas que l'utilisateur clique sur une autre colonne pour retrier le dgv
Mais ca c'est vrai dans TOUS les cas pour ce type d'action, je pense qu'il faut disabler le sort par user click sinon ca sert a rien de se casser le noeud a reorganiser les row chirurgicalement si d'un coup de souris l'utilisateur innocent peu tout casser !!
En réalité je fais une copie de la row entiere que je souhaite déplacer (soit celle qui est sélectionnée). Une fois la copie effectuée, je supprime la ligne sélectionnée, puis j'insère la copie à la ligne d'indice voulu (selon le Up ou le Down)
ps : bien entendu le tri des colonnes est désactivé... Je ne l'avais pas précisé dans mon post
Salut
Oui j'avais bien compris ce que tu faisais mais c'est ce que je trouve comme toi un peu lourd
Que pense tu de mon idée d'utiliser un tri automatique sur une colonne complémentaire cachée (ou pas) dont tu swappe les valeurs
Oui ça pourrait le faire comme ca aussi.
Une façon de contourner les choses, mais est-ce plus simple (plus élégant, performant) de modifier toutes les valeurs de ta table (ta solution si je l'ai bien compris demande de modifier la valeur de la colonne d'integer non ?)
Il ne faudara 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
L'avantage a mon avis (mais il faut essayer) c'est aussi que si on travaille avec un datagridview bindé tu pourrais ajouter cette colonne et la traiter indépendemment des data réellement bindées
Oui c'est vrai.Envoyé par olibara
a voir ...Envoyé par olibara
Bon
Tu essaye et tu me dis quoi
......
Si j'ai qq chose qui roule bien, je t'informe
Je ne pense pas faire le test. Je ne suis pas vraiment convaincu sur cette solution en fait.
D'autant plus que les fonctionnalités 'Supprimer une ligne' et 'Insérer une ligne' vont avoir un impact sur le numérotation. Voilà pourquoi je trouve cette solution un peu galère et ça reste à mon avis de la bidouille
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
Pas vraiment.
Juste un : "Bon Courage"
Impact tres facilement gerable
1- Suprimez = aucun impact
2- Ajouter = il suffit de forcer un numero sur base du nombre de row connu !!
A mon avis c'est beaucoup moins de bidouille que ta solution qui est asser complexe a mettre en oeuvre si tu travaille avec un DGV bindé
Tandis que ma solution ne touche pas au données ET EN PLUS elle n'exclut pas un tri sur une autre colonne qui aurait chez toi pour effet de perdre tout le travail effectué !!
Il faut déjà savoir que j'ai une application particulière et que je suis resté fixé dessus. J'interdis le tri des colonnes obligatoirement, c'est donc pas un problème pour moi.
Et je sais pas pourquoi mais j'avais à l'esprit que tu mettait cette colonne (colonne d'indice) en base
Pourtant cette pas faute de l'avoir signalé ...
Salut,
La mecanique est ok
J'ai encore eu un petit souci avec la colonne d'indice
Je pensais pourvoir la garder non bindée mais IMPOSSIBLE de trier sur une
colonne non bindée
Pas de problème, j'ai creé une colonne speciale a dans le remplissage du datasource qui n'interviendra pas dans les MAJ
Mais maintenant, j'aimerais trouver l'indice du current row selectionné histoire de trouver faciliment celui au dessus et celui en dessous et je trouve pas !!(rien n'est simple)
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
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 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]; }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager