[C#] DataRow.ItemArray.SetValue petit soucis

DataRow.ItemArray.SetValue petit soucis [C#] - C#/.NET managed - Programmation

Marsh Posté le 08-03-2005 à 09:53:42    

Bonjour,
 
J'ai repris recemment le développement en .NET, plus particulièrement en CSharp, et à l'heure actuelle je suis bloqué sur une betise mais je ne m'en sort pas.
 
Voilà ce que j'essaie de faire :
 
J'ai une table de compétiteurs ayant comme champ le nom d'un Club, à côté de ça j'ai une table pour ces Clubs (nom, Ville).
Je trie mes compétiteurs selon certains critères pour obtenir un DataSet (et une DataTable), et je veux construire une autre DataTable basée sur la liste des Clubs, auquel je rajoute une colonne qui me servira de compteur pour connaitre le nombre de compétiteur par Club.
 
Jusqu'ici tout marche à peu près sauf que je n'arrives pas à incrémenter ce compteur qui reste à la valeur par défaut (0), en fait j'utilise la méthode SetValue mais ça ne semble pas marcher.
 
Voici le code :
 
 
//Ajout de la colonne Nombre de combattants par club
 
System.Data.DataColumn cNbrComp = new System.Data.DataColumn();
 
cNbrComp.ColumnName = "NbCompetiteur";
 
cNbrComp.DefaultValue = 0;
 
cNbrComp.DataType = System.Type.GetType("System.Int32" );
 
dsClubs.Tables["Clubs"].Columns.Add(cNbrComp);
 
 
// Définition de la clé primaire
 
System.Data.DataColumn[] cles = new System.Data.DataColumn[1];
 
cles[0] = dsClubs.Tables["Clubs"].Columns[0];
 
dsClubs.Tables["Clubs"].PrimaryKey = cles;
 
 
// Récupération du nombre de combattants par clubs
 
for (int i=0;i<monDS.Tables["Competiteur"].Rows.Count;i++)
 
{
 
System.Data.DataRow tempLigne = dsClubs.Tables["Clubs"].Rows.Find(monDS.Tables["Competiteur"].Rows[i].ItemArray[5]);
 
//System.Windows.Forms.MessageBox.Show(tempLigne.ItemArray[0].ToString() + " " + tempLigne.ItemArray[2].ToString() + " " + ((int) (tempLigne.ItemArray[2])).ToString());
 
tempLigne.ItemArray.SetValue( (int) (tempLigne.ItemArray.GetValue(2)) + 1, 2);
 
}
 
J'ai vérifié que la méthode Find me récupérait bien le bon Club, l'incrementation fonctionne bien, j'obtiens 1 (0 + 1), mais je n'arrives pas à mettre cette valeur dans le DataRow et je ne comprends pas pourquoi, ma colonne n'étant pas en ReadOnly.
 
Si quelqu'un a une idée, je l'en remercie d'avance.
 
Michael.


---------------
Membre de la Team HFr OFP -- New Zealand Trip
Reply

Marsh Posté le 08-03-2005 à 09:53:42   

Reply

Marsh Posté le 08-03-2005 à 10:04:52    

Désolé d'avoir posté, je viens de trouver la solution et ça commençait sérieusement à m'enerver.
Et pouratant j'avais fait moult recherches avant de poster, mais finalement pas assez apparemment.
 
Pour ceux qui sont interessés voilà la solution, qui tiens plus du bidouillage qu'autre chose à mon avis.
 
Au lieu d'utiliser SetValue qui ne fonctionne pas apparemment, il faut directement référencer avec les indices ou noms de colonnes :
 
tempLigne.ItemArray.SetValue( (int) (tempLigne.ItemArray.GetValue(2)) + 1, 2);  
 
Deviens
 
tempLigne[2] = (int) (tempLigne.ItemArray.GetValue(2)) + 1;
 
J'avais essayé avec tempLigne.ItemArray[2] et ça marchait pas mieux que le SetValue.
Va comprendre Charles.
 
Encore une fois désolé pour ce faux Post, en espérant que ça aide quand même quelqu'un un de ces quatres.


---------------
Membre de la Team HFr OFP -- New Zealand Trip
Reply

Marsh Posté le 08-03-2005 à 10:36:23    

Il est bizarre ton code :heink: J'me demande si tu te compliques pas la vie :)

Reply

Marsh Posté le 08-03-2005 à 11:36:14    

J'adores faire compliqué mais si tu as une solution plus simple je suis preneur.
 
Sachant que le but à la fin est d'avoir une liste de Judokas, répartis par poule, en essayant de ne pas avoir tous les Judokas d'un même club dans une même poule, et ce n'est pas chose facile.


---------------
Membre de la Team HFr OFP -- New Zealand Trip
Reply

Marsh Posté le 08-03-2005 à 11:39:13    

En gros tu clone la table Clubs, et tu y rajoute une colonne avec le nombre de compétiteurs ?

Reply

Marsh Posté le 08-03-2005 à 12:04:03    

Oui ça me permet derrière de trier cette table pour avoir en premier les Clubs avec le plus de combattants et ainsi pouvoir répartir les Clubs les plus nombreux dans les différentes poules, en ayant au final maximum 2 combattants du même club dans une poule de 4.


---------------
Membre de la Team HFr OFP -- New Zealand Trip
Reply

Marsh Posté le 08-03-2005 à 12:14:28    

Sinon tu définis une relation entre la table Club et la table Compétiteurs. Puis avec la méthode GetChildRows, tu récupère tous les compétiteurs pour un clubs. Et tu met la ligne à jour :)
 
Donc ça donnera un truc du genre (en VB.NET, mais ça change pas grand chose ;)) :
 

Code :
  1. For Each Row as DataRow in dsClubs.Tables("Clubs" )
  2.   Row("NbCompetiteur" ) = Row.GetChildRows("Clubs-Compétiteurs" ).Length
  3. Next


Et pis voilà :)

Reply

Marsh Posté le 08-03-2005 à 14:30:03    

Je n'ai pas mis de relations pour l'instant, même si c'est une erreur de ma part, le programme étant assez simple je ne voulais pas pousser trop loin les chose et compliquer.
 
Mais je retiens ton truc, merci pour les infos.


---------------
Membre de la Team HFr OFP -- New Zealand Trip
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed