Index datagrid [Résolu]

Signaler
Messages postés
17
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
2 avril 2007
-
 hicham_899 -
Bonjour,
J'aimerais faire monter ou decendre les enregistrements dans un datagrid en pressant sur des boutons.

j'arrive à récupérer la valeur de l'index de ma ligne, mais comment faire pour lui attribuer une autre valeur par la suite?

Code :
int iIndex;
iIndex = int.Parse(dgMenu.CurrentRow.Index.ToString());
iIndex = iIndex -1;
dgMenu.CurrentRow.Index = iIndex ;

merci

27 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Bon, voila un petit bout de code effectif pour un bouton "descendre"
Il faut donc ajouter une colonne "Position" a ta Table.
Il faut aussi que la propriété "Sort" de la vue affectée a ton DataGridView soit "Position" (pour qu'il rearrange les lignes triées par position)

<hr />

DataRowView row1 = (
DataRowView) dgMenu.CurrentRow.DataBoundItem;

int index = dgMenu.CurrentRow.Index;

int position = (
int) row1[
"Position"];

DataRowView row2 = (
DataRowView) dgMenu.Rows[index + 1].DataBoundItem;

if(row2 !=
null)
{
   row1[
"Position"] = position + 1;
   row2[
"Position"] = position;
   row1.EndEdit();
   row2.EndEdit();
}

<hr />
Ensuite, pour enregistrer les changements dans ta bdd, tu appeles la méthode Update de ton TableAdapter en lui passant ton DataSet en parametre. Et le tout est joué :)

Mx
MVP C# 
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Salut,
Si ce que tu veux c'est sélectionner une ligne de ton DataGridView par programmation, tu peux faire comme ceci:

this.dataGridView1.Rows[x].Selected =
true;

<hr />
-Blog-
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Salut,

Pourquoi tu utilises la méthode ToString() sur ton index pour le caster en int ensuite ? Index est deja de type int ;)
Sinon pour changer la positionnne d'une ligne, tu peux utiliser les méthode RemoveAt() et Insert() de ta collection de Rows.

Mx
MVP C# 
Messages postés
17
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
2 avril 2007

Merci morpionMx,
j'ai fait:



int
iIndexDepart;


int
iIndexArrive;


int
itabindex;

itabindex = dgMenu.TabIndex;
iIndexDepart = dgMenu.CurrentRow.Index;
iIndexArrive = iIndexDepart - 1;
dgMenu.Rows.InsertCopy(iIndexDepart, iIndexArrive);
dgMenu.Rows.RemoveAt(iIndexDepart);

Mais le problème c'est que ca me donne l'erreur suivante:

Rows cannot be programmatically added to the DataGridView's rows collection when the control is data-bound.

comment faire pour remédier à cela?
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Ah oui, si ton DataGrid est bindé, alors c'est dans ta source de données que tu vas devoir rearranger tes lignes.

Mx
MVP C# 
Messages postés
17
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
2 avril 2007

ca veut dire que je suis obligé de faire une série de requette? je ne peut pas travailler en local sur mon datagrid?
et sinon comment puis-je faire pour que mon DataGrid ne soit pas litmité?

Merci d'avance
Messages postés
17
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
2 avril 2007

impossible d'ajouter une ligne dans mon datagrid?
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

Salut


Si ton datagridview est bindé, ça veut dire que tu as un objet bindingsource qui gère ta source de donnée.


Sur le bindingsource, tu peux te servir de la propriété "Position" que tu peux incrémenter ou décrémenter.
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

J'ai oublié mais tu as même des méthodes MoveNext, MoveFisrt et MoveLast sur le bindingsource
Messages postés
17
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
2 avril 2007

oui mais comment tu peux appliquer ces méthodes?
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

Dans l'événement click de ton bouton

tu fais
If (tonBindingSource.position != -1)
   tonBindingSource.MoveNext
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Non en fait si j'ai bien compris il souhaite changer l'emplacement de certaines lignes, et pas changer de ligne.

Mais jusque la je vois pas trop ce qui ne va pas dans la méthode proposée.
Si ton DataGridView est bindé à une List<> par exemple, tu peux utiliser les méthode RemoveAt et Insert de ta liste.

Mx
MVP C# 
Messages postés
17
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
2 avril 2007

oui mais mon BindingSource je le déclare sur une autre action. J'ai un liste et sur changement de cette liste, je remplit mon DataGrid :
BindingSource

bs =
newBindingSource(); bs.DataSource Program.GetDataTable(sSql);dgMenu.DataSource bs.DataSource;

Ensuite, dans le même formulaire, j'ai un bouton et j'aimerais que lorsque je presse ce bouton, mon enregisrtement dans mon DataGrid decende d'une case.

et là si je fait bs.MoveNext ca ne marchera pas...
Messages postés
17
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
2 avril 2007

je suis un novice et je vous fait predre du temps désolé mais là je suis vraiment bloqué...

Donc normalement si je fait ca:

iIndexDepart = dgMenu.CurrentRow.Index;

iIndexArrive = iIndexDepart - 1;

dgMenu.Rows.RemoveAt(iIndexDepart);

dgMenu.Rows.Insert(iIndexArrive, dgMenu.Rows[iIndexDepart]);

ca devrait marcher??

mais j'ai sur dgMenu.Rows.Insert(iIndexArrive, dgMenu.Rows[iIndexDepart]); Rows cannot be programmatically added to the DataGridView's rows collection when the control is data-bound.

comment faire??

merci encore mille fois de votre aide
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
A quoi ton DataGridView est il bindé ?

Mx
MVP C# 
Messages postés
17
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
2 avril 2007

Le but étant la gestion dynamique d'un menu, donc les liens enregistrés dans une base de donnée, sont afficher dans mon DataGrid comme il sont enregistrés dans ma base.

Puis j'aimerais que l'utilisateur puisse sans autre les faires montrer ou décendre et pour finir les enregistrer dans la base comme ils les a disposé dans le DataGrid..
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Oui mais a quel type de collection ton DataGridView est bindé ? DataTable ? Liste ? ..

Mx
MVP C# 
Messages postés
17
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
2 avril 2007

datatable
Messages postés
17
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
2 avril 2007

en fait c'est comme si il fallait fermer la liaison entre ma base de donnée et mon datagridview
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
C'est justement le principe du mode déconnecté, il charge les données dans ton dataSet puis se deconnecte, et se reconnecte quand tu veux procéder a une mise a jour de tes données.

Mais jusque là, je ne te suis pas. Parce qu'une fois tes lignes echangées, meme si tu veux sauver leur position dans la base de données, elle reapparaitront de nouveau dans le meme ordre.
Ce qu'il faut, c'est que tu aies une colonne contenant la position de la ligne dans ton menu, et que tu changes ce nombre via le clic du bouton, puis que tu retries ta vue.

Si ce n'est pas le but recherché, alors je pense qu'il va nous falloir plus d'explications ;)

Mx
MVP C#