Trier les données

Le
Gloops
Bonjour tout le monde,

Je cherche à trier, pour affichage via un dataset, les données lues d=
ans
un fichier xml, et là où ça se corse un peu c'est que je veux trier=
sur
une valeur calculée d'après deux champs (un champ date et un champ
entier "intervalle de dates", qu'il convient d'additionner, pour trier
selon la date de fin).

Sur un champ de la table lue j'aurais fait une requête SQL avec une
clause ORDER et on n'en parlait plus, là la piste du DataView est a
priori prometteuse, mais je ne réussis pas à trouver comment mettre ç=
a
en œuvre.

D'après ce que j'ai lu il faut passer par un DataRowView pour alimenter=

le DataView, donc une fois qu'on l'a créé par DataView.Add, on a
DataView.Count = 1, mais une fois que l'ajout est validé par
DataRowView.EndEdit, le DataView.Count repasse à 0, ce qui semble
invalider quelques exemples de codes que j'ai trouvés par ci par là.

Ou alors, je ne m'y suis pas pris comme il fallait pour alimenter le
DataView, enfin bon j'ai utilisé le constructeur comme dit dans msdn.

Dans ce style-là :
==
==
ds.Tables[0].DefaultView.Sort = "DateCible";
foreach (DataRow r in ds.Tables["tabRepet"].Rows)
{
int ervalle = (int)r["repIntervalle"];
dt.Rows.Add(r["repIntitule"], r["repDate"], r["repIntervalle"],
(long)((DateTime)r["repDate"]).AddDays(ervalle).Ticks);

System.Diagnostics.Debug.Print(((DateTime)r["repDate"]).AddDays(ervalle)=
.ToString());
}
DataView dv = new DataView(dt, "", "DateCible",
DataViewRowState.ModifiedOriginal);
dv.Table.DefaultView.Sort = "DateCible";
==
==

Au début le champ repDate était de type date, et puis je me suis dema=
ndé
si il y avait un souci avec le tri des dates alors j'ai converti en
long, de toute façon l'ordre est le même.

Trouve-t-on un exemple vraiment fonctionnel, quelque part ?

J'ai mis dans la propriété Sort du DataView le nom du champ sur leque=
l
je veux trier comme il apparaît ci-dessus, ainsi que dans
DataViewSettings comme ci-dessous, cependant mes enregistrements
ressortent systématiquement dans l'ordre de la création, ce qui est l=
e
souci, puisque les deux ordres ne coïncident pas.

DataViewManager dvm = new DataViewManager(ds);

dvm.DataViewSettings["tabRepet"].Sort = "DateCible";

Quelqu'un saurait-il m'orienter ?
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Gloops
Le #20799551
J'ai trouvé.
Si on veut faire un tri sur une DataTable, c'était effectivement une
bonne idée de s'intéresser à ce constructeur de DataView :

public DataView (
DataTable table,
string RowFilter,
string Sort,
DataViewRowState RowState
)

L'erreur se situait dans l'aide de ce constructeur, elle consiste à ne
rien préciser pour l'argument RowFilter.
Comme il est indiqué un type string, il me paraissait naturel, si je
voulais pas de filtre, de mettre une chaîne vide.
A la place il faut mettre null, et dans ce cas le tri fonctionne.
_____________________________________
Gloops a écrit, le 17/12/2009 17:47 :
Bonjour tout le monde,

Je cherche à trier, pour affichage via un dataset, les données lues dans
un fichier xml, et là où ça se corse un peu c'est que je veux tri er sur
une valeur calculée d'après deux champs (un champ date et un champ
entier "intervalle de dates", qu'il convient d'additionner, pour trier
selon la date de fin).

Sur un champ de la table lue j'aurais fait une requête SQL avec une
clause ORDER et on n'en parlait plus, là la piste du DataView est a
priori prometteuse, mais je ne réussis pas à trouver comment mettre ça
en œuvre.

D'après ce que j'ai lu il faut passer par un DataRowView pour aliment er
le DataView, donc une fois qu'on l'a créé par DataView.Add, on a
DataView.Count = 1, mais une fois que l'ajout est validé par
DataRowView.EndEdit, le DataView.Count repasse à 0, ce qui semble
invalider quelques exemples de codes que j'ai trouvés par ci par là .

Ou alors, je ne m'y suis pas pris comme il fallait pour alimenter le
DataView, enfin bon j'ai utilisé le constructeur comme dit dans msdn.

Dans ce style-là :
======================== ======
ds.Tables[0].DefaultView.Sort = "DateCible";
foreach (DataRow r in ds.Tables["tabRepet"].Rows)
{
int ervalle = (int)r["repIntervalle"];
dt.Rows.Add(r["repIntitule"], r["repDate"], r["repIntervalle"],
(long)((DateTime)r["repDate"]).AddDays(ervalle).Ticks);

System.Diagnostics.Debug.Print(((DateTime)r["repDate"]).AddDays(erv alle).ToString());

}
DataView dv = new DataView(dt, "", "DateCible",
DataViewRowState.ModifiedOriginal);
dv.Table.DefaultView.Sort = "DateCible";
======================== ======

Au début le champ repDate était de type date, et puis je me suis de mandé
si il y avait un souci avec le tri des dates alors j'ai converti en
long, de toute façon l'ordre est le même.

Trouve-t-on un exemple vraiment fonctionnel, quelque part ?

J'ai mis dans la propriété Sort du DataView le nom du champ sur leq uel
je veux trier comme il apparaît ci-dessus, ainsi que dans
DataViewSettings comme ci-dessous, cependant mes enregistrements
ressortent systématiquement dans l'ordre de la création, ce qui est le
souci, puisque les deux ordres ne coïncident pas.

DataViewManager dvm = new DataViewManager(ds);

dvm.DataViewSettings["tabRepet"].Sort = "DateCible";

Quelqu'un saurait-il m'orienter ?


Publicité
Poster une réponse
Anonyme