Index datagrid

Résolu
nixounet Messages postés 17 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 2 avril 2007 - 12 mars 2007 à 13:12
 hicham_899 - 28 juin 2007 à 16:13
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

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
13 mars 2007 à 11:00
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# 
cs_Bidou Messages postés 5486 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
12 mars 2007 à 13:18
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-
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
12 mars 2007 à 13:31
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# 
nixounet Messages postés 17 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 2 avril 2007
12 mars 2007 à 14:05
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?

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
12 mars 2007 à 14:11
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# 
nixounet Messages postés 17 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 2 avril 2007
12 mars 2007 à 14:28
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
nixounet Messages postés 17 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 2 avril 2007
12 mars 2007 à 15:12
impossible d'ajouter une ligne dans mon datagrid?
thorgal1612 Messages postés 117 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 janvier 2008
12 mars 2007 à 16:12
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.
thorgal1612 Messages postés 117 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 janvier 2008
12 mars 2007 à 16:16
J'ai oublié mais tu as même des méthodes MoveNext, MoveFisrt et MoveLast sur le bindingsource
nixounet Messages postés 17 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 2 avril 2007
12 mars 2007 à 16:36
oui mais comment tu peux appliquer ces méthodes?
thorgal1612 Messages postés 117 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 janvier 2008
12 mars 2007 à 16:51
Dans l'événement click de ton bouton

tu fais
If (tonBindingSource.position != -1)
   tonBindingSource.MoveNext
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
12 mars 2007 à 17:11
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# 
nixounet Messages postés 17 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 2 avril 2007
12 mars 2007 à 17:11
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...
nixounet Messages postés 17 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 2 avril 2007
12 mars 2007 à 17:22
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
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
12 mars 2007 à 17:24
A quoi ton DataGridView est il bindé ?

Mx
MVP C# 
nixounet Messages postés 17 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 2 avril 2007
12 mars 2007 à 17:26
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..
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
12 mars 2007 à 17:29
Oui mais a quel type de collection ton DataGridView est bindé ? DataTable ? Liste ? ..

Mx
MVP C# 
nixounet Messages postés 17 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 2 avril 2007
13 mars 2007 à 06:58
datatable
nixounet Messages postés 17 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 2 avril 2007
13 mars 2007 à 07:08
en fait c'est comme si il fallait fermer la liaison entre ma base de donnée et mon datagridview
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
13 mars 2007 à 09:50
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# 
Rejoignez-nous