Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Trier les données

1 réponse
Avatar
Gloops
Bonjour tout le monde,

Je cherche =E0 trier, pour affichage via un dataset, les donn=E9es lues d=
ans=20
un fichier xml, et l=E0 o=F9 =E7a se corse un peu c'est que je veux trier=
sur=20
une valeur calcul=E9e d'apr=E8s deux champs (un champ date et un champ=20
entier "intervalle de dates", qu'il convient d'additionner, pour trier=20
selon la date de fin).

Sur un champ de la table lue j'aurais fait une requ=EAte SQL avec une=20
clause ORDER et on n'en parlait plus, l=E0 la piste du DataView est a=20
priori prometteuse, mais je ne r=E9ussis pas =E0 trouver comment mettre =E7=
a=20
en =9Cuvre.

D'apr=E8s ce que j'ai lu il faut passer par un DataRowView pour alimenter=
=20
le DataView, donc une fois qu'on l'a cr=E9=E9 par DataView.Add, on a=20
DataView.Count =3D 1, mais une fois que l'ajout est valid=E9 par=20
DataRowView.EndEdit, le DataView.Count repasse =E0 0, ce qui semble=20
invalider quelques exemples de codes que j'ai trouv=E9s par ci par l=E0.

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

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

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

Au d=E9but le champ repDate =E9tait de type date, et puis je me suis dema=
nd=E9=20
si il y avait un souci avec le tri des dates alors j'ai converti en=20
long, de toute fa=E7on l'ordre est le m=EAme.

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

J'ai mis dans la propri=E9t=E9 Sort du DataView le nom du champ sur leque=
l=20
je veux trier comme il appara=EEt ci-dessus, ainsi que dans=20
DataViewSettings comme ci-dessous, cependant mes enregistrements=20
ressortent syst=E9matiquement dans l'ordre de la cr=E9ation, ce qui est l=
e=20
souci, puisque les deux ordres ne co=EFncident pas.

DataViewManager dvm =3D new DataViewManager(ds);

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

Quelqu'un saurait-il m'orienter ?

1 réponse

Avatar
Gloops
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 ?