none
ListBox : Problème de récupération de la valeur sélectionnée RRS feed

  • Question

  • Bonjour à tous,

    Apres plusieurs recherches sur le net, je ne trouve pas de solution à mon problème concernant une listbox.

    Mon programme doit vérifier que plusieurs listbox ont des valeurs sélectionnés et différentes des valeurs par défaut. Or une listbox bien précise visant à vérifier l'état d'un ticket ne semble pas prendre en compte les changements fait par l'utilisateur, alors que les autres listbox fonctionnent correctement. 

    J'ai vérifier les conditions, les retours effectués par ma requête Sql et tout semble correct. Je ne trouve vraiment pas d'ou viens mon erreur. Voici le code effectué concernant la listbox problématique :

    Page Web Aspx :

    <%@ Page Title="" Language="C#" MasterPageFile="~/ticketing.Master" AutoEventWireup="true" CodeBehind="ticket-détail.aspx.cs" Inherits="WebApplication1.Ticketing" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="Head" runat="server">
        <!-- Titre de la page -->
        Ticket ref : <% Response.Write(Request.Params["ref"]); %>
    </asp:Content>
    
    <asp:Content ID="Content2" ContentPlaceHolderID="Main" runat="server">
        <!-- On met en place les champs du mail -->
        <div id="Detail_Ticket_Div">
            <!-- Emplacement des informations de ticket -->
            <table id="detail_ticket">
              <% AfficherTableDetailTicket(); %>
            <tr>
                <td><label for="Liste_Profil_Ticket"> Profil ticket : </label></td>
                <td><asp:DropDownList ID="Liste_Profil_Ticket" runat="server" AppendDataBoundItems="True" OnLoad="AfficherListeProfilTicket"></asp:DropDownList></td>
            </tr>
            <tr>
                <td><label for="Liste_Techno_Ticket"> Technologie fixe : </label></td>
                <td><asp:DropDownList ID="Liste_Techno_Ticket" runat="server" AppendDataBoundItems="True" OnLoad="AfficherListeTechnoTicket"></asp:DropDownList></td>
            </tr>
            <tr>
                <td><label for="Liste_Etat_Ticket"> Etat ticket : </label></td>
                <td><asp:DropDownList ID="Liste_Etat_Ticket" runat="server" AppendDataBoundItems="True" OnLoad="AfficherListeEtatTicket"></asp:DropDownList></td>
            </tr>
            <tr>
                <td><label for="Liste_User_Ticket"> Assignation : </label></td>
                <td><asp:DropDownList ID="Liste_User_Ticket" runat="server" AppendDataBoundItems="True" OnLoad="AfficherListeUserTicket"></asp:DropDownList></td>
            </tr>
            </table>
        </div>
    
        <div id="Detail_Ticket_Com_Emp">
            <!-- Emplacement des cadres de commentaires -->
            <label for="Champ_Ticket_Com"> Commentaires : </label><br />
            <asp:TextBox runat="server" id="Champ_Ticket_Com" text="" TextMode="MultiLine"></asp:TextBox>
        </div>
    
        <div id="Detail_Ticket_PJ">
            <!-- Emplacement du cadre des PJ -->
            <label for="Champ_Ticket_PJ"> Pièce(s) Jointe(s) : </label><br />
            <table id="pj_ticket">
                <tr>
                    <td>                
                        <asp:DropDownList ID="Liste_PJ_Ticket" runat="server" AppendDataBoundItems="True" OnLoad="AfficherPieceJointe"></asp:DropDownList>
                    </td>
                </tr>
                <tr>
                    <td><asp:Button ID="ButtonPJTicket" runat="server" OnClick="LoadProcess" Text="Ouvrir" /></td>
                </tr>
            </table>
        </div>
    
        <div id="Detail_Ticket_Histo">
            <!-- Emplacement du cadre des historiques -->
            <label for="Champ_Ticket_Histo"> Historique : </label><br />
            <asp:TextBox runat="server" id="Champ_Ticket_Histo" text="" TextMode="MultiLine" Enabled="False"></asp:TextBox>
            <% AfficherHistoriqueTicket(); %>
        </div>
            
        <!-- On met en forme les boutons -->
        <table id="Table_Placement_Bouton">
            <tr>
                <td><asp:Button ID="ButtonSaveTicket" runat="server" OnClick="SaveTicket" Text="Enregistrer" /></td>
                <td> - </td>
                
                <td><asp:Button ID="ButtonBackTicket" runat="server" OnClick="AnnulerTicket" Text="Annuler" /></td>
            </tr>
         </table>
    </asp:Content>

    Code Behind .CS => Création de la listbox problématique :

    protected void AfficherListeEtatTicket(object sender, EventArgs e)
            {
                /* Fonction d'affichage de l'état des tickets */
    
                // Déclaration des variables
                string Ref_Use = Request.Params["ref"];
                MySqlCommand cmd = new MySqlCommand("SELECT id_statut, Nom_Statut FROM statut", con);
    
                // On nettoie la listbox avant de la remplir
                //Liste_Etat_Ticket.Items.Clear();                      Test pour eviter les champs à doublon dans la listbox une fois la page rechargée
    
                // On exécute la commande Sql
                using (MySqlDataReader requestcmd = cmd.ExecuteReader())
                {
                    // On affiche les statuts possible du ticket
                    Liste_Etat_Ticket.DataSource = requestcmd;                            // Donne la requete source donnant les données
                    Liste_Etat_Ticket.DataTextField = "Nom_Statut";                       // Donne la colonne des valeurs à afficher
                    Liste_Etat_Ticket.DataValueField = "id_statut";                       // Donne la colonne des ids à liers aux valeurs
                    Liste_Etat_Ticket.DataBind();                                         // Lie les valeurs et les ids                 
                }
    
                // On prépare la requête pour sélectionner par défaut le statut actuel du ticket 
                cmd.CommandText = "SELECT id_statut FROM statut NATURAL JOIN ticket NATURAL JOIN mail WHERE Ref_Mail = @ref";
                cmd.Parameters.Add("@ref", MySqlDbType.String).Value = Ref_Use;
    
                using (MySqlDataReader request = cmd.ExecuteReader())
                {
                    // On récupère la valeur recherchée
                    string idstatut = "";
                    
                    while (request.Read())
                    {
                        idstatut = request.GetString(0);            // On positionne la listbox à l'état du ticket
                    }
    
                    Liste_Etat_Ticket.SelectedValue = idstatut;
                }
            }

    Et enfin code behind .CS = partie concernant la vérification des sélections

    protected void SaveTicket(object sender, EventArgs e)
            {
                /* Fonction de modification des tickets */
                
                // Déclaration des variables
                string Ref_Use = Request.Params["ref"];
                string id_Mail = "";
                string id_ticket = "";
                string profil = "";
                string techno = "";
                string date = "";
                string statut = "";
                string personne = "";
                string commentaire = "";
    
                bool verify = false;
                
    
    
                MySqlCommand cmd = new MySqlCommand();
    
                // On récupère l'id du mail
                cmd.CommandText = "SELECT id_mail, id_ticket FROM mail NATURAL JOIN ticket WHERE Ref_Mail = @ref";
                cmd.Parameters.Add("@ref", MySqlDbType.String).Value = Ref_Use;
                cmd.Connection = con;
    
                // On exécute la requête
                using (MySqlDataReader request = cmd.ExecuteReader())
                {
                    while (request.Read())
                    { 
                        // On récupère les données
                        id_Mail = request.GetString(0);
                        id_ticket = request.GetString(1);
                    }
                }
    
                // On vérifit si un profil a été sélectionné pour le ticket
                profil = Liste_Profil_Ticket.SelectedValue.ToString();
    
                if (profil != "default")
                {
                    // Un profil ticket a été sélectionné, On regarde maintenant si le profil est technique ou non
                    cmd.CommandText = "SELECT Nom_Profil FROM profil WHERE id_profil = @profil";
                    cmd.Parameters.Add("@profil", MySqlDbType.String).Value = profil;
    
                    // On éxecute la commande
                    using (MySqlDataReader request = cmd.ExecuteReader())
                    {
                        while (request.Read())
                        { 
                            // On test le nom de profil
                            if (request.GetString(0) == "Technique")
                            {
                                verify = true;
                            }
                            else
                            {
                                verify = false;
                            }
                        }
                    }
    
                    if (verify == true)
                    {
                        // Le profil est technique. On doit vérifier si une technologie est renseignée
                        techno = Liste_Techno_Ticket.SelectedValue.ToString();
    
                        if (techno != "default")
                        {
                            // Une technologie a été sélectionné. On vérifie à présent le statut du ticket
                            verify = false;                                             // On réinitialise la variable de vérification à false
                            
                            statut = Liste_Etat_Ticket.SelectedItem.ToString();
                            //string test= Liste_Etat_Ticket.SelectedValue.ToString();
                            // On vérifie si un statut a été sélectionné
                            if (statut != "Nouveau")
                            {
                                date = DateTime.Now.ToString();                            // On enregistre la date actuelle qui servira de date de prise en charge date_PEC
                                
                                // Le statut est différent de nouveau, on doit à présent vérifier si le ticket est assigné à une personne 
                                personne = Liste_User_Ticket.SelectedValue.ToString();
                                
                                // On vérifie si une personne a été sélectionné
                                if (personne != "default")
                                { 
                                    // Une assignation a été sélectionné. On vérifie si l'on a un commentaire ou non                                    
                                    commentaire = Champ_Ticket_Com.Text.ToString();
    
                                    // On vérifie si l'on a un commentaire
                                    if (String.IsNullOrWhiteSpace(Champ_Ticket_Com.Text))
                                    {
                                        // Champ commentaire ne contenant rien. On enregistre les données
                                        cmd.CommandText = "UPDATE ticket SET id_statut=@idstatut, id_technologie=@idtechnologie, id_profil=@idprofil WHERE id_mail=@idmail";
                                        cmd.Parameters.Add("@idstatut", MySqlDbType.String).Value = statut;
                                        cmd.Parameters.Add("@idtechnologie", MySqlDbType.String).Value = techno;
                                        cmd.Parameters.Add("@idprofil", MySqlDbType.String).Value = profil;
                                        cmd.Parameters.Add("@idmail", MySqlDbType.String).Value = id_Mail;
    
                                        // On verifie le bon déroulement de la requête
                                        try
                                        {
                                            cmd.ExecuteNonQuery();      // Execution requête
                                        }
                                        catch (InvalidOperationException Ex)
                                        {
                                            // La modification a échoué, on affiche l'exception
                                            string Result_Request;
                                            Result_Request = Ex.Message;
                                        }
    
                                        // On prépare à présent la requête pour les historiques
                                        cmd.CommandText = "INSERT INTO historique (Date_PEC, Date_Assignation, Date_Changement_Etat, id_ticket, id_utilisateur) VALUES (@datetoday, @datetoday, @datetoday, @idticket, @iduser)";
                                        cmd.Parameters.Add("@datetoday", MySqlDbType.String).Value = date;
                                        cmd.Parameters.Add("@idticket", MySqlDbType.String).Value = id_ticket;
                                        cmd.Parameters.Add("@iduser", MySqlDbType.String).Value = personne;
    
                                        // On verifie le bon déroulement de la requête
                                        try
                                        {
                                            cmd.ExecuteNonQuery();      // Execution requête
                                        }
                                        catch (InvalidOperationException Ex)
                                        {
                                            // La modification a échoué, on affiche l'exception
                                            string Result_Request;
                                            Result_Request = Ex.Message;
                                        }
                                    }
                                    else
                                    {
                                        // Champ commentaire avec des caractères. On enregistre les données
                                        cmd.CommandText = "UPDATE ticket SET id_statut=@idstatut, id_profil=@idprofil WHERE id_mail=@idmail";
                                        cmd.Parameters.Add("@idstatut", MySqlDbType.String).Value = statut;
                                        cmd.Parameters.Add("@idprofil", MySqlDbType.String).Value = profil;
                                        cmd.Parameters.Add("@idmail", MySqlDbType.String).Value = id_Mail;
    
                                        // On verifie le bon déroulement de la requête
                                        try
                                        {
                                            cmd.ExecuteNonQuery();      // Execution requête
                                        }
                                        catch (InvalidOperationException Ex)
                                        {
                                            // La modification a échoué, on affiche l'exception
                                            string Result_Request;
                                            Result_Request = Ex.Message;
                                        }
    
                                        // On prépare à présent la requête pour les historiques
                                        cmd.CommandText = "INSERT INTO historique (Date_PEC, Date_Assignation, Date_Changement_Etat, id_ticket, id_utilisateur) VALUES (@datetoday, @datetoday, @datetoday, @idticket, @iduser)";
                                        cmd.Parameters.Add("@datetoday", MySqlDbType.String).Value = date;
                                        cmd.Parameters.Add("@idticket", MySqlDbType.String).Value = id_ticket;
                                        cmd.Parameters.Add("@iduser", MySqlDbType.String).Value = personne;
    
                                        // On verifie le bon déroulement de la requête
                                        try
                                        {
                                            cmd.ExecuteNonQuery();      // Execution requête
                                        }
                                        catch (InvalidOperationException Ex)
                                        {
                                            // La modification a échoué, on affiche l'exception
                                            string Result_Request;
                                            Result_Request = Ex.Message;
                                        }
    
                                        // On prépare la requête pour enregistrer les commentaires
                                        cmd.CommandText = "INSERT INTO commentaire (Commentaire, id_mail) VALUES (@commentaire, @idmail)";
                                        cmd.Parameters.Add("@commentaire", MySqlDbType.String).Value = commentaire;
                                        cmd.Parameters.Add("@idmail", MySqlDbType.String).Value = id_Mail;
    
                                        // On verifie le bon déroulement de la requête
                                        try
                                        {
                                            cmd.ExecuteNonQuery();      // Execution requête
                                        }
                                        catch (InvalidOperationException Ex)
                                        {
                                            // La modification a échoué, on affiche l'exception
                                            string Result_Request;
                                            Result_Request = Ex.Message;
                                        }
                                    }
                                }
                                else
                                {
                                    // Aucune assignation effectuée
                                    Liste_User_Ticket.BorderColor = Color.Red;
                                }
                            }
                            else
                            {
                                // Statut : Nouveau : Changer le statut
                                Liste_Etat_Ticket.BorderColor = Color.Red; 
                            }
                        }
                        else
                        {
                            // Aucune technologie n'a été sélectionné 
                            Liste_Techno_Ticket.BorderColor = Color.Red;
                        }
                    }

    Je ne présente pas la seconde partie du code de vérification car elle regroupe des traitements similaires avec une vérification en moins. 

    Le problème se situe sur la vérification

    // On vérifie si un statut a été sélectionné if (statut != "Nouveau")

    Il n'y a aucun message d'erreur.

    Si vous souhaitez des précisions n'hésitez pas à me demander, je reste à votre disposition

    Merci d'avance

    mercredi 10 décembre 2014 09:32

Réponses

Toutes les réponses

  • Bonjour,

    Je Remarque une difference dans l'utilisation des lite box :

    statut = Liste_Etat_Ticket.SelectedItem.ToString();
    

    Dans les autreslistbox vous utilisez la propriété SelectedValue.

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    mercredi 10 décembre 2014 09:57
  • Oui j'ai essayé différentes choses mais sans résultat.

    J'ai testé le SelectItem pour voir si la listbox ne prenais que la valeur de la sélection par défaut ou sil elle prenait vraiment le nom et la valeur par défaut.

    Avec le debug j'ai pu voir que c'etait vraiment le tout à savoir la valeur et l'item par defaut qu'il prenait. Ce qui m'a amené à penser que le logiciel ne prend vraiment pas en compte les changement sur cette listbox. 

    En soit la requête sql lors de la création de la listbox retourne bien tout les valeurs et celles-ci sont bien utilisés pour l'affichage avec les bonnes valeurs. La partie concernant la sélection de l'etat d'un ticket à son orgine est également parfaitement fonctionnel apres des tests effectués. Mais il garde en mémoire lors du changement de statut la valeur par défaut ce qui n'est pas normal. D'autant plus que je récupère bien la valeur de la listbox via 

                            statut = Liste_Etat_Ticket.SelectedValue.ToString();

    (testé avant que je bidouille sans grand espoir). Normalement il devrait récupérer la valeur après soumission du formulaire et donc la nouvelle valeur.

    mercredi 10 décembre 2014 11:31
  • Est-ce que vous avez regardé si le nevigateur postait bien les données au moment du postBack ?

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    mercredi 10 décembre 2014 12:15
  • Non je n'ai pas regardé au niveau du navigateur, les seuls tests effectués ont été sur la vision du debug avec les points d'arrets de visual studio 2012. 

    Comment puis je faire pour vérifier les données au moment du postBack ? 

    Edit : Je viens de tester en rajoutant la ligne "Response.Redirect("ticket-détail?profil="+Liste_Etat_Ticket.SelectedItem.ToString()+"");"

    J'ai pu ainsi remarquer que le navigateur envoie bien la bonne donnée sectionnée. De fait le problème doit venir entre le moment ou le navigateur envoie la donnée et le moment ou les données sont traités par mon code behind.


    jeudi 11 décembre 2014 09:37
  • Bonjour,

    A quel endroit avez-vous rajouté cette ligne dans votre code behind ?


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    jeudi 11 décembre 2014 13:57
  • Au tout début de la fonction après la déclaration des variables. 


    jeudi 11 décembre 2014 14:09
  • Si au début de la méthode, le champs

    Liste_Etat_Ticket.SelectedItem.ToString() est correcte, il n'y a aucune raison pour qu'en plein milieu il soit incorrect.

    En debug, que voyez vous au début de la méthode ?

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    jeudi 11 décembre 2014 15:03
  • Le problème semble être résolue.

    Je n'ai pourtant rien touché depuis hier mais il semble prendre la valeur désormais suite à la fermeture/ouverture de VS.

    Merci pour votre aide

    Cdt,

    vendredi 12 décembre 2014 09:12