IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Problème de récupération d'indice dans une listbox


Sujet :

ASP.NET

  1. #1
    Membre extrêmement actif
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Ingénieur Cloud
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Billets dans le blog
    20
    Par défaut Problème de récupération d'indice dans une listbox
    Bonjour j'ai une page qui contient une listeBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <asp:DropDownList ID="typ" name="typ" runat="server" ></asp:DropDownList>
    Que je remplis grâce à une base de donnée au chargement de la page.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //Création de la connexion
                    conn = Connection.getConnectionGetteur();
                    //Ouverture de la connection
                    conn.Open();
                    //Sert à avoir le nombre de ligne de la requête
                    cmdType = new SqlCommand(null, conn);
                    cmdType.CommandText = "SELECT * FROM TYPEP ";
                    readType = cmdType.ExecuteReader();
                    typ.Items.Clear();
                    while (readType.Read())
                    {
                        string libelle = (string)readType.GetSqlString(1);
                        Guid id = readType.GetGuid(0);
                        typ.Items.Add(libelle);
                        idType.Add(id);
                    }
    Je remplis donc la listebox avec le libellé et dans le même temps je remplis une list qui contient les id des libellé.

    Quand tous les champs sont validé, on clique sur le bouton enregistré. Qui exécute une action d'on une requête sql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    //Création de la connexion
                    conn = Connection.getConnectionSetteur();
                    //Ouverture de la connection
                    conn.Open();
                    //Insertion du nouveau bien
     
     
                    //Requête préparer qui empeche l'injection
                    insert = new SqlCommand(null, conn);
                    insert.CommandText = "INSERT DEMANDE (codeDemande, villeRecherche, surfaceMin, surfaceMax, prixMin, prixMax, idIntervenant, idType, codePostalRecherche) " +
                                         "values (NEWID(), @villeRecherche, @surfaceMin, @surfaceMax, @prixMin, @prixMax, @idIntervenant, @idType, @codePostalRecherche)";
     
                    SqlParameter villeRecherche = new SqlParameter("@villeRecherche", SqlDbType.Text, 20);
                    villeRecherche.Value = this.ville.Text;
                    SqlParameter codePostalRecherche = new SqlParameter("@codePostalRecherche", SqlDbType.Text, 5);
                    codePostalRecherche.Value = this.cp.Text;
                    SqlParameter surfaceMin = new SqlParameter("@surfaceMin", SqlDbType.Int);
                    surfaceMin.Value = this.surfaceMin.Text;
                    SqlParameter surfaceMax = new SqlParameter("@surfaceMax", SqlDbType.Int);
                    surfaceMax.Value = this.surfaceMax.Text;
                    SqlParameter prixMin = new SqlParameter("@prixMin", SqlDbType.Int);
                    prixMin.Value = this.prixMin.Text;
                    SqlParameter prixMax = new SqlParameter("@prixMax", SqlDbType.Int);
                    prixMax.Value = this.prixMax.Text;
                    SqlParameter idIntervenant = new SqlParameter("@idIntervenant", SqlDbType.UniqueIdentifier);
                    idIntervenant.Value = Session["idLogin"];
                    SqlParameter idTYPEP = new SqlParameter("@idType", SqlDbType.UniqueIdentifier);
                    idTYPEP.Value = this.idType[indexType];
     
     
                    insert.Parameters.Add(villeRecherche);
                    insert.Parameters.Add(surfaceMin);
                    insert.Parameters.Add(surfaceMax);
                    insert.Parameters.Add(prixMin);
                    insert.Parameters.Add(prixMax);
                    insert.Parameters.Add(idIntervenant);
                    insert.Parameters.Add(idTYPEP);
                    insert.Parameters.Add(codePostalRecherche);
                    insert.ExecuteNonQuery();
    Tous ça marche, mais pas comme il faut. En effet pour récupéré l'id je me sert de l'indice que me renvoie this.typ.SelectedIndex
    Soit l'indice de la valeur sélectionner dans la liste box.

    Mais en inspectant ma base, je me suis rendu compte que l'id enregistré était toujours le même. Le premier.

    En faisant un débugage, je me suis rendu compte aussi que quand je clique sur le bouton. Il rechargeais d'abord la page. Puis exécuter le code du bouton.

    Parce que mes valeur ne sont pas réinitialisé dans mes textbox ça ne pose pas trop de problème. Sauf que la listebox elle est rechargé et reprend ça valeur par défaut. Je me retrouve donc toujours avec la première valeur de sélectionner.

    Je ne trouve pas de solution à mon problème, je ne voie même pas pourquoi le onload se fait avant le click du bouton.
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  2. #2
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Problème typique de tout débutant qui a du mal à saisir les subtilités du post back

    Regarde du côté de Page.IsPostBack

  3. #3
    Membre extrêmement actif
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Ingénieur Cloud
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Billets dans le blog
    20
    Par défaut
    Merci maitre jedi, alors oui en effet je ne passe plus par le onload, mais pour une obscure raison cela me lève un exception

    sur cette ligne
    idTYPEP.Value = this.idType[indexType]; (la 28)
    En effet quand je clique ma liste se retrouve à null. C'est la seul variable qui passe à null une idée d'erreur typique que j’ai pu commettre encore ?

    Sachant que je ne l'instancie que dans le IsPostBack et nul par d'autre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    if (!IsPostBack)
                {
                    // Validate initially to force asterisks
                    // to appear before the first roundtrip.
                    Validate();
     
                    idType = new List<Guid>();
     
                    if (Session["Login"] == null)
                    {
                        Server.Transfer("Login.aspx", true);
                    }
                    else
                    {
                        erreurLog.Text = "Bienvenue " + Session["Login"].ToString();
                    }
     
                    try
                    {
                        //Création de la connexion
                        conn = Connection.getConnectionGetteur();
                        //Ouverture de la connection
                        conn.Open();
                        //Sert à avoir le nombre de ligne de la requête
                        cmdType = new SqlCommand(null, conn);
                        cmdType.CommandText = "SELECT * FROM TYPEP ";
                        readType = cmdType.ExecuteReader();
                        typ.Items.Clear();
                        while (readType.Read())
                        {
                            string libelle = (string)readType.GetSqlString(1);
                            Guid id = readType.GetGuid(0);
                            typ.Items.Add(libelle);
                            idType.Add(id);
                        }
                    }
                    catch (Exception ex)
                    {
     
                    }
                    finally
                    {
                        //Fermeture de la connexion et du datareader
                        if (readType != null)
                        {
                            readType.Close();
                        }
                        conn.Close();
                    }
                }
     
            }
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  4. #4
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Je comprends pas tout à ton code...
    Elle sert à quoi ta liste idType?

    Puis c'est quoi le message d'erreur exact?

  5. #5
    Membre extrêmement actif
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Ingénieur Cloud
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Billets dans le blog
    20
    Par défaut
    La liste idType contient les guid propre à chaque libellé, dans le même ordre.

    Quand je remplis la listbox la liste idType est remplis en parallèle, comme ça selon le libellé sélectionné et son indice je peux retrouver l'id correspondant

    Le message d'erreur est un nullPointerExpection, car en effet ma liste idType perd toute ses info quand je clique sur le bouton.

    Bizarrement j'ai une autre variable de type int qui garde sa valeur quand j'appuie sur le bouton
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  6. #6
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Citation Envoyé par MarieKisSlaJoue Voir le message
    La liste idType contient les guid propre à chaque libellé, dans le même ordre.

    Quand je remplis la listbox la liste idType est remplis en parallèle, comme ça selon le libellé sélectionné et son indice je peux retrouver l'id correspondant
    Ca sert à rien, le guid tu l'as dans le SelectedItem

    Un truc dans le genre:

    idTYPEP.Value = typ.SelectedValue

  7. #7
    Membre extrêmement actif
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Ingénieur Cloud
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Billets dans le blog
    20
    Par défaut
    non justement, c'est le libellé que j'ai dans le typ.SelectedValue, l'id du type j'ai que trouver la solution de la liste remplis en parallèle pour pouvoir les garder. Mais bah visiblement il ne sont pas garder dans la liste et j'aimerai bien savoir pourquoi.
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  8. #8
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Ouille aïe aïe...

    Bon, en Webform, les contrôles sont mis dans le viewstate. Cela permet de préserver leur état entre deux postback: http://msdn.microsoft.com/fr-fr/libr...(v=vs.80).aspx. C'est très pratique car cela permet de ne pas avoir à aller rechercher les données. C'est pour cela qu'on écrit ceci dans le page load:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if(!IsPostback)
    {
          typ.Datasource = MaClasseStatique.MaSourceDeDonnees;
          typ.DataTextField = "Libelle";
          typ.DataValueField = "Guid";
          typ.Databind();
    }
    La classe MaClasseStatique permet de répartir les responsabilités entre l'obtention des données et leur affichage. Tu devrais en créer une, cela rendra ton code plus facile à lire.

    Sinon, les listes déroulantes disposent de deux attributs/propriétés: Value et Text. Il faut les utiliser. La propriété Value sert à stocker l'identifiant unique utile pour mettre à jour les enregistrements.

    Enfin, tu pourrais lire ceci: http://immobilis.developpez.com/arti...ouche-asp-net/

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  9. #9
    Membre extrêmement actif
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Ingénieur Cloud
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    J'ai lu quelque chose de similaire cette après midi sur le développement en couche, et en effet j'aurai plutôt du procédé comme ceci, je m'en rend compte maintenant. Je suis en train d'ailleurs de récrire les classes métiers et d'accès aux données

    Citation Envoyé par Immobilis Voir le message
    Ouille aïe aïe...

    Bon, en Webform, les contrôles sont mis dans le viewstate. Cela permet de préserver leur état entre deux postback: http://msdn.microsoft.com/fr-fr/libr...(v=vs.80).aspx. C'est très pratique car cela permet de ne pas avoir à aller rechercher les données. C'est pour cela qu'on écrit ceci dans le page load:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if(!IsPostback)
    {
          typ.Datasource = MaClasseStatique.MaSourceDeDonnees;
          typ.DataTextField = "Libelle";
          typ.DataValueField = "Guid";
          typ.Databind();
    }
    La classe MaClasseStatique permet de répartir les responsabilités entre l'obtention des données et leur affichage. Tu devrais en créer une, cela rendra ton code plus facile à lire.

    Sinon, les listes déroulantes disposent de deux attributs/propriétés: Value et Text. Il faut les utiliser. La propriété Value sert à stocker l'identifiant unique utile pour mettre à jour les enregistrements.
    j'ai du mal à comprendre
    typ.Datasource = MaClasseStatique.MaSourceDeDonnees;
    MaSourceDeDonnees est bien le résultat d'un requête sql excuter dans la classe MaClasseStatique, c'est ça ?
    Et typ.Databind(); une sorte de "j'enregistre les info" ?
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 15
    Par défaut
    Citation Envoyé par MarieKisSlaJoue Voir le message
    La liste idType contient les guid propre à chaque libellé, dans le même ordre.

    Quand je remplis la listbox la liste idType est remplis en parallèle, comme ça selon le libellé sélectionné et son indice je peux retrouver l'id correspondant

    Le message d'erreur est un nullPointerExpection, car en effet ma liste idType perd toute ses info quand je clique sur le bouton.

    Bizarrement j'ai une autre variable de type int qui garde sa valeur quand j'appuie sur le bouton
    Tu peux mettre ta liste en session la première fois que tu la rempli, puis ensuite tu la réutilises
    Session["laListe"] = idType;

    idType = (List<Guid>)Session["laListe"] ;

  11. #11
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Faut arrêter avec les solutions bancales
    Immo et moi t'avons donné une solution propre et qui fonctionne

  12. #12
    Membre extrêmement actif
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Ingénieur Cloud
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Billets dans le blog
    20
    Par défaut
    J'essaye la solution d'immo, mais je ne la comprend pas et n’arrive donc pas à l'appliquer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClasseStatique.MaSourceDeDonnees
    Renvoie quel type de retour ? N'importe ?
    cette fonction moi renvoie une List<Type> remplis de tous les objet type qui on pour attribut un id de type guid et une libelle de type string.

    mais quand je fait ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typ.DataTextField = unType.Libelle; // Il me l’accepte car de type string
          typ.DataValueField =  unType.Id; //Il me le refuse car impossible de convertir un Guid en string
    Or moi déjà c'est bien un Guid que je veux en valeur.

    De plus cette ligne
    il me dit que une référence ou using est peut être manquante. Pourtant je fait bien au début.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    using System.Web;
    using System.Web.UI;
    Je comprend donc vraiment pas
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  13. #13
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par MarieKisSlaJoue Voir le message
    J'essaye la solution d'immo, mais je ne la comprend pas et n’arrive donc pas à l'appliquer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClasseStatique.MaSourceDeDonnees
    Renvoie quel type de retour ? N'importe ?
    Presque. En fait tout les objets qui implémentent l'une de ces interfaces: IListSource, IEnumerable ou IDataSource. En pratique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class MonObjet
    {
        public string Libelle { get; set; }
        public string Guid { get; set; }
    }
    public partial class WebFormDropDownList : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                List<MonObjet> mesObjets = new List<MonObjet>();
                mesObjets.Add(new MonObjet { Libelle = "Libelle 1", Guid = Guid.NewGuid().ToString() });
                mesObjets.Add(new MonObjet { Libelle = "Libelle 2", Guid = Guid.NewGuid().ToString() });
                mesObjets.Add(new MonObjet { Libelle = "Libelle 3", Guid = Guid.NewGuid().ToString() });
                mesObjets.Add(new MonObjet { Libelle = "Libelle 4", Guid = Guid.NewGuid().ToString() });
                DropDownList1.DataSource = mesObjets;
                DropDownList1.DataTextField = "Libelle";
                DropDownList1.DataValueField = "Guid";
                DropDownList1.DataBind();
            }
        }
    }
    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  14. #14
    Membre extrêmement actif
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Ingénieur Cloud
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Billets dans le blog
    20
    Par défaut
    Ok, c'est bon, ça marche, j'ai compris, ça fait exactement ce que je voulais. Je vous remercie infiniment.
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de formatage de nombre dans une listbox
    Par Jean-Marc68 dans le forum C#
    Réponses: 3
    Dernier message: 29/11/2007, 19h01
  2. Problème de récupération de champs dans une DW
    Par SandraG dans le forum Powerbuilder
    Réponses: 3
    Dernier message: 27/11/2007, 12h08
  3. Réponses: 2
    Dernier message: 21/09/2007, 11h37
  4. [MySQL] Problème de récupération des données dans une fonction
    Par highman dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 26/10/2006, 20h04
  5. Problème de récupérations de données dans une table mysql
    Par Helpine dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 09/03/2006, 19h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo