DataReader et DropDownList, probleme de retour de donnees

Résolu
Evil_Gouki_X Messages postés 19 Date d'inscription mardi 29 mai 2007 Statut Membre Dernière intervention 22 mai 2010 - 26 nov. 2007 à 10:33
Evil_Gouki_X Messages postés 19 Date d'inscription mardi 29 mai 2007 Statut Membre Dernière intervention 22 mai 2010 - 27 nov. 2007 à 04:24
Bonjour a tous.

je poursuis tranquilement le developpement en c# et voila que je me heurte a un probleme qui semblerait tout bete pour vous. Cependant je n'arrive pas a m'en sortir.
 donc j'explique: (VS2005, BD sqlserver2000, avec la requete SQL je dois afficher 6 resultats)

j'ai trouve comment afficher des infos rapidement dans une combo box grace au DataReader:

protected void Page_Load(object sender, EventArgs e)
    {
    SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["myConnectionString"].ToString());
    SqlCommand cmd = new SqlCommand("TEST", cn);
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    SqlDataReader reader = null;



    cn.Open();
    try
    {
     reader = cmd.ExecuteReader();
     while (reader.Read())
     {
      ddlTestReader.Items.Add(reader["product_name"].ToString());
     }
     reader.Close();
    }
    catch (Exception ex)
    {
     lblErrmsg.Text = "Voila l'erreur" + ex;
    }
    cn.Close();
        
    }
</Code C#>
Ca ca marche au poil, j'ai mes donnees de BD qui s'affiche dans mon ddl. MAIS (oui il y a toujours un mais) vous aurez remarquez que ce programme se trouve dans le protected void Page_Load. En general je cree le programme dans d'autre fichier cs et je les instancie dans mon programme proprement dit.

J'ai donc cree sur une feuille cs a part, une class que j'ai appele Master avec une methode que j'ai appele testdureade.
mais le probleme c'est qu'en faisant ca ma fonction ne me retourne que la valeur de la premiere ligne de la BD.

<Code C#protected void Page_Load>
protected void Page_Load(object sender, EventArgs e)
    {
        Master master = new Master();       
        
       ddlTestReader.Items.Add(master.testduReader());        
    }


public class Master
{
    public Master()
    {
    }
public string testduReader()
 {
  SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["myConnectionString"].ToString());
  SqlCommand cmd = new SqlCommand("TEST", cn);
  cmd.CommandType = System.Data.CommandType.StoredProcedure;
  SqlDataReader reader = null;
  
  cn.Open();
  try
  {
   reader = cmd.ExecuteReader();
   while (reader.Read())
   {
    return reader["product_name"].ToString();
   }
   
   reader.Close();
  }
  catch
  {
   return "ERROR";
  }
  cn.Close();
//si je ne met que le return vert une erreur est generee apres compilation, quand ma page se charge.
//et si je ne met que le return rouge je ne peux pas compiler car 
//on me signal qu'il manque une valeur a renvoyer. donc faute de mieux j'ai mis ca.
  return reader["product_name"].ToString();  
 }
 }


En Faisant le debug je me suis appercu que la boucle while est arretee au return (en rouge) et que c'est pour cela que je n'ai donc qu'une seule valeur dans mon drop down list.
mon probleme c'est que je ne sais vraiment pas quoi utiliser pour me renvoyer toutes les valeurs.
j'ai essaye avec ArrayList, List<string>. mais le probleme c'est qu'il me retourne la list et non pas son contenu.
j'ai aussi essaye plusieurs changements mais je ne suis arrive a rien de mieux.

auriez vous une piste pour moi s'il vous plait?

3 réponses

SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
26 nov. 2007 à 10:54
Hello,

Essaie de créer ta méthode en retournant une liste de string :

public

List<string> testduReader()
{
List<string> result = newList<string>();
...

using (reader = cmd.ExecuteReader()){
while (reader.Read())
   {
    result.Add(reader["product_name"].ToString());
   }
return result;
}
...
}

Puis remplis ton ddlTestReader comme ceci :

ddlTestReader.Items.AddRange(testduReader().ToArray());

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
3
Evil_Gouki_X Messages postés 19 Date d'inscription mardi 29 mai 2007 Statut Membre Dernière intervention 22 mai 2010 1
27 nov. 2007 à 04:07
Salut SharpMao
merci pour ton aide.
grace a toi j'ai trouver une autre facon legerement differentes utilisant les ListItems. je la met ici ca peut servir peut etre.
bien entendu j'espere avoir des critiques sur cette facon de faire afin de pouvoir l'ameliorer.

protected void Page_Load(object sender, EventArgs e)
    {
           List<ListItem> mylist = new List<ListItem>();                               
          Master master = new Master();    
          mylist = master.testduReader();
          ddlTestReader.Items.AddRange(mylist.ToArray());
   }


public List<ListItem> testduReader()
 { 
        SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["myConnectionString"].ToString());
        SqlCommand cmd = new SqlCommand("TEST", cn);
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        SqlDataReader reader = null;
        List<ListItem> mylists = new List<ListItem>();
  
        cn.Open();
           try
           {
               reader = cmd.ExecuteReader();
                  while (reader.Read())
                  {
                         ListItem mylist = new ListItem();
                         mylist.Text = reader["product_name"].ToString();    
                         mylists.Add(mylist);
                  }
               reader.Close();
           }
           catch
           {
               System.Diagnostics.Debug.WriteLine(ex.Message);
           }
           cn.Close();
           return mylists;
 }
3
Evil_Gouki_X Messages postés 19 Date d'inscription mardi 29 mai 2007 Statut Membre Dernière intervention 22 mai 2010 1
27 nov. 2007 à 04:24
ah j'ai un ami qui vient de me donner une methode qui est plus efficace a ce qu'il parait.
elle fonctionne bien donc je la met aussi.

protected void Page_Load(object sender, EventArgs e)
    {
           xMaster.testduReader(ddlTestReader);
   }


//ps: heu.. j'ai du changer ma Class Master en xMaster car il y avait des problemes de reconnaissances
//en effet Master existe deja et est utilise pour les master page si je ne me trompe pas
public class xMaster{

public xMaster(){}

public static void testduReader(DropDownList ddl)
  {
  
   SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["myConnectionString"].ToString());
   SqlCommand cmd = new SqlCommand("TEST", cn);
   cmd.CommandType = System.Data.CommandType.StoredProcedure;
   SqlDataReader reader = null;   
   cn.Open();
   try
   {
    reader = cmd.ExecuteReader();
    while (reader.Read())
    {   
      //PS: ici je peux selectionner 2 colonnes de ma BD. je n'ai plus besoin de la liste
     ddl.Items.Add(new ListItem(reader["product_name"].ToString(),reader["product_id"].ToString()));
    }

      reader.Close();
   }
   catch (Exception ex)
   {
    System.Diagnostics.Debug.WriteLine(ex.Message);
   }
   cn.Close();   
  }
}


a plus
3
Rejoignez-nous