Classe PlaceHolder l'affichage de l'ordre voulu [Résolu]

Signaler
Messages postés
39
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
15 janvier 2014
-
Messages postés
39
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
15 janvier 2014
-
Bonjour,

Je récupère les informations sous le format XML d'un service Web...

Je mets les informations dans un " Generic List<type>" et les affiche par la "classe PlaceHolder".

Affichage c'est en ordre de l'information venue par le service WEB donc par "Id".
Comment peux-je changer l'affichage de cet ordre : par exemple selon "BwEtatId"


---Pour clarifier la situation : -----
Voici mon code :
                List<ConstructIdent> monListSansAnnulation = new List<ConstructIdent>();
                int etatId;
                foreach (ConstructIdent inscription in monInscription)
                {
                    etatId = inscription.BwEtatId;

                    if (!etatId.Equals(3))
                    {
                        monListSansAnnulation.Add(inscription);
                    }
                }


                int i = 1;
                PlaceHolder1.Controls.Add(new LiteralControl("\"));
PlaceHolder1.Controls.Add(new LiteralControl(\"----
Inscription No., Description, Etat, Debut, Fin, changement, \"));

tVisualiserPageState.Inscriptions = new ConstructIdent[monListSansAnnulation.Count];

foreach (ConstructIdent inscription in monListSansAnnulation)
{
etatId = inscription.BwEtatId;

string etats;

switch (etatId)
{
case 0:
etats = \"Pas encore\";
break;
case 1:
etats = \"Actif\";
break;
case 2:
etats = \"Suspendu\";
break;
case 3:
etats = \"Annulé\";
break;
case 4:
etats = \"Expiré\";
break;
default:
etats = \"non identifié\";
break;
}

PlaceHolder1.Controls.Add(new LiteralControl(\"----
\"));

// inscription id
PlaceHolder1.Controls.Add(new LiteralControl(\""));
Label inscriptionIdLabel = new Label();
inscriptionIdLabel.ID = "inscriptionIdLabel" + i.ToString();
inscriptionIdLabel.Text = inscription.Id.ToString();
PlaceHolder1.Controls.Add(inscriptionIdLabel);
PlaceHolder1.Controls.Add(new LiteralControl(", \"));

// descriptionData
PlaceHolder1.Controls.Add(new LiteralControl(\""));
Label descriptionDataLabel = new Label();
descriptionDataLabel.ID = "descriptionDataLabel" + i.ToString();
descriptionDataLabel.Text = GetDescriptionData(inscription.BaseId);
PlaceHolder1.Controls.Add(descriptionDataLabel);
PlaceHolder1.Controls.Add(new LiteralControl(", \"));
PlaceHolder1.Controls.Add(new LiteralControl(\""));

// etats
Label etatsLabel = new Label();
etatsLabel.ID = "etatsLabel" + i.ToString();
etatsLabel.Text = etats;
PlaceHolder1.Controls.Add(etatsLabel);
PlaceHolder1.Controls.Add(new LiteralControl(", \"));
PlaceHolder1.Controls.Add(new LiteralControl(\""));

// Debut etat
Label DepartDebutLabel = new Label();
DepartDebutLabel.ID = "DepartDebutLabel" + i.ToString();
DepartDebutLabel.Text = GetDepartDescription(inscription.BaseId, inscription.IdDepart);
PlaceHolder1.Controls.Add(DepartDebutLabel);
PlaceHolder1.Controls.Add(new LiteralControl(", \"));
PlaceHolder1.Controls.Add(new LiteralControl(\""));

// Fin etat
Label FinDebutLabel = new Label();
FinDebutLabel.ID = "FinDebutLabel" + i.ToString();
FinDebutLabel.Text = GetDepartDescription(inscription.BaseId, inscription.IdFin);
PlaceHolder1.Controls.Add(FinDebutLabel);
PlaceHolder1.Controls.Add(new LiteralControl(", \"));

// bouton changement
PlaceHolder1.Controls.Add(new LiteralControl(\""));
Button changementBouton = new Button();
changementBouton.ID = "changementBouton_" + i.ToString();
changementBouton.Text = "Rectifier";
if ((inscription.BwEtatId == 3))
changementBouton.Enabled = false;

changementBouton.Click += new System.EventHandler(this.changementBouton_Click);
PlaceHolder1.Controls.Add(changementBouton);

PlaceHolder1.Controls.Add(new LiteralControl(", \"));
PlaceHolder1.Controls.Add(new LiteralControl(\"\"));

tVisualiserPageState.Inscriptions[i - 1] = inscription;
i++;

}

                PlaceHolder1.Controls.Add(new LiteralControl("
"));



                SavePageState(); 


---Pour clarifier la situation : -----
voici exemple des informations venu par Web service :
<?xml version="1.0" encoding="utf-8" ?> 

 <ConstructIdent>
  5
  1a1
  4
  4408R
  4410R 
 </ConstructIdent>

 <ConstructIdent>
  9
  1a1
  0
  4408R
  4410R 
 </ConstructIdent>


 <ConstructIdent>
  18
  1a1
  1
  4408R
  4410R 
 </ConstructIdent>


Merci

11 réponses

Messages postés
39
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
15 janvier 2014

Bonjour, voila la solution plus simple et plus belle :

Merci pour vos aides :

					//(...... etc)

//demande info par nameId sur les inscriptions
              ConstructIdent[] myInscriptions = InscriptionsWP.GetInscriptions(nameId);

                // declaration Generic List<type>
              List<ConstructIdent> monListSansAnnulation = new List<ConstructIdent>();
                int etatId;
            

int localisation;
            bool repere;

            foreach (ConstructIdent inscription in monInscription)
            {
                etatId = inscription.BwetatId;

                if (!etatId.Equals(3))
                {
                    localisation = 0;
                    repere = false;

                    foreach (ConstructIdent InsertInscription in monListSansAnnulation)
                    {
                        if (inscription.BwetatId < InsertInscription.BwetatId)
                        {


                            monListSansAnnulation.Insert(localisation, inscription);
                            repere = true;
                            break;
                        }

                        localisation++;
                    }



                    if (!repere)
                    {

                        monListSansAnnulation.Add(inscription);
                    }
                }
            }

           
int i = 1;
//(...... etc)
Messages postés
15928
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 mai 2021
544
Bonsoir,

il faut que dans ta classe ConstructIdent, tu implémentes Icomparable.

Regarde cette source


Whismeril
Messages postés
39
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
15 janvier 2014

Bonjour Whismeril,

Je ne comprends pas très bien...
ConstructIdent, c'est dans webService en format xml donc je ne peux pas changer le web service...


je demande, par mon fichier c#, ainsi les informations :


//demande info par nameId sur les inscriptions
ConstructIdent[] myInscriptions = InscriptionsWP.GetInscriptions(nameId);

// declaration Generic List<type>
List<ConstructIdent> monListSansAnnulation = new List<ConstructIdent>();
Messages postés
39
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
15 janvier 2014

Dans mon cas, est ce que c,est plus facile d'utiliser "Enumerable.OrderBy" ?
Messages postés
15928
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 mai 2021
544
Bonjour,
je pensais que tu avais créé une classe en fonction du format de ton web service.
Là je ne sais pas.


Whismeril
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
44
Salut

Tu peux utiliser Linq pour faire un OrderBy()

maListeOrdonnee maListe.OrderBy(element> element.BwEtatId).ToList();


Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
39
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
15 janvier 2014

Bonsoir krimog,

Merci pour ton message

ce que j'ai fait...
j'ai ajouté les lignes suivantes après le "using System.Collections.Generic;" :
using System.Linq; 
using System.Text;  


ensuite après la déclaration Generic List, j'ai ajouté ton code :
//demande info par nameId sur les inscriptions
              ConstructIdent[] myInscriptions = InscriptionsWP.GetInscriptions(nameId);

//demande info par nameId sur les inscriptions
ConstructIdent[] myInscriptions = InscriptionsWP.GetInscriptions(nameId);

// declaration Generic List<type>
List<ConstructIdent> monListSansAnnulation = new List<ConstructIdent>();

//ton code Linq : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
monListSansAnnulation monListSansAnnulation.OrderBy(element> element.BwEtatId).ToList();

//ensuite la reste : 

Mais j'ai eu le message d'erreur :
[list]
Compiler Error Message: CS0234: The type or namespace name 'Linq' does not exist in the namespace 'System' (are you missing an assembly reference?)
Line: 10

Line 10: using System.Linq;
/list
Alors où je fais la bêtise ?
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
44
Salut

Je vois deux possibilités pour ton problème.

1) Tu n'es pas en Framework 3.5 ou supérieur
(Il faut que tu aies minimum Visual Studio 2008, et que quand tu fasse Clic-droit -> propriétés sur ton projet, tu aies bien "Framework Cible" 3.5 ou supérieur)
2) Tu n'as pas la référence vers System.Core
Vérifie si elle y est dans le dossier References de ton projet. Si elle n'y est pas, il faut que tu fasses Clic-droit sur ton projet -> Ajouter une référence -> Onglet ".NET" -> System.Core

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
39
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
15 janvier 2014

Salut Krimog,

sur mon pc, local, :
[list]
Microsoft Visual Studio 2010
Version 10.0.30319.1 RTMRel
Microsoft .NET Framework
Version 4.0.30319 RTMRel
Version installée : WD Express
Microsoft Visual Web Developer 2010
/list

et j'ai .NET Framework 4
en plus sous WD Express lorsque j'ai voulu ajouté la référence vers System.Core mais j'ai eu le message suivant :
Le site Web fait déjà référence à l'assembly 'System"core'

Et j'affiche la page sans message d'erreur sous Firefox et IE localement sur mon pc...

Sur mon serveur (donc, je n'ai pas installé WD 2010 Express)
il y a MS.Net Fremworrk 3.5 SP1 et j'ai ainsi System.Core.dll dans C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5
mais je n'arrive pas afficher la page : il y a la même erreur....
[list]
Compiler Error Message: CS0234: The type or namespace name 'Linq' does not exist in the namespace 'System' (are you missing an assembly reference?)
Line: 10
/list

alors comment je peux référencer, sur le serveur, sans WD Express, à l'assembly 'System.core' ?
Messages postés
39
Date d'inscription
jeudi 9 juin 2011
Statut
Membre
Dernière intervention
15 janvier 2014

encore moi Krimog,
et voici mon 2e question :

avec ton code :
monListSansAnnulation <gras>monListSansAnnulation.OrderBy(element> element.BwEtatId).ToList();</gras>


j'arrive afficher ma page, localement, sous Firefox/ IE sans erreur, mais le résultat n'est pas trié selon BwEtatId. c'est comme avant (en ordre de l'information venue par le service WEB donc par "Id")

Dans WD 2010 Express, lorsque mon curseur est sur OrderBy

J'ai le message suivant de MVWD2010Express :
[i]"(variable locale) List<ConstructIdent> monListSansAnnulation
Erreur :
'System.Collections.Generic.List' ne contient pas une définition pour 'OrderBy' et aucune méthode d'extension 'OrderBy' accetant un premier argument de type 'System.Collections.Generic.List' n'a été trouvée (une
directive using ou une référence d'assembly est-elle manquante ?)/i

Pourquoi il y a ce message et pourquoi il n'y a pas l'affichage en ordre de "BwEtatId"??

Bonne journée

p.s : rappel :
//demande info par nameId sur les inscriptions
              ConstructIdent[] myInscriptions = InscriptionsWP.GetInscriptions(nameId);

//demande info par nameId sur les inscriptions
ConstructIdent[] myInscriptions = InscriptionsWP.GetInscriptions(nameId);

// declaration Generic List<type>
List<ConstructIdent> monListSansAnnulation = new List<ConstructIdent>();

//ton code Linq : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
monListSansAnnulation monListSansAnnulation.OrderBy(element> element.BwEtatId).ToList();

//ensuite la reste : 
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
44
Je ne comprends pas pourquoi il ne trouve pas System.Linq (et franchement, je trouve ça étonnant). Mais s'il ne le trouve pas, c'est normal qu'il ne trouve pas la méthode OrderBy() (qui est une méthode d'extension, c'est-à-dire qui ne se trouve pas directement dans la classe).

Quant au fait que tu aies la page sans erreur sous Firefox et IE, je pense que c'est dû au fait que tant qu'il ne peut pas compiler, il ne met pas à jour ton répertoire de sortie. Donc en fait, c'est la dernière version fonctionnelle que tu vois (selon moi).

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -