Combobox à colonnes multiples [Résolu]

Gaedarr 50 Messages postés lundi 4 février 2013Date d'inscription 12 mars 2015 Dernière intervention - 2 avril 2012 à 09:10 - Dernière réponse : Gaedarr 50 Messages postés lundi 4 février 2013Date d'inscription 12 mars 2015 Dernière intervention
- 3 avril 2012 à 10:42
Bonjour,

Cela fait un moment que je fais des recherche, mais rien de concluant pour le moment.

Je recherche à concaténer deux champs de mon tableau et à l'afficher via le displaymember.

Voici une partie de mon code :

                #region Remplissage de la combobox anciennes rubriques

                string strCommande = "SELECT DISTINCT `Trimestre`,`Annee` FROM `rubriques` WHERE `rubriques`.`Key` !=0";
                CommandeSQL.RemplissageAnciennesRubriques(strCommande, DS_Remplissage);

                cbbRubriques.DataSource = DS_Remplissage;
                cbbRubriques.DisplayMember = "Concat";
                cbbRubriques.ValueMember = "Key";
                cbbRubriques.Refresh();

                #endregion


Et la méthode RemplissageAnciennesRubriques :

public DataSet RemplissageAnciennesRubriques(string chaine_commande, DataSet DS_Remplissage)
        {
            try
            {
                //string chaine_commande = "SELECT DISTINCT `Trimestre`,`Annee` FROM `rubriques` WHERE `rubriques`.`Key` !=0";

                maSelectCommand.SelectCommand = new MySqlCommand(chaine_commande, ConnectionRessource);
                DS_Remplissage.Clear();
                DS_Remplissage.Tables.Add("Trimestre");
                DS_Remplissage.Tables.Add("Annee");
                maSelectCommand.Fill(DS_Remplissage.Tables[0]);
                maSelectCommand.Fill(DS_Remplissage.Tables[1]);

                DS_Remplissage.Tables.Add("Concat");
                DS_Remplissage.Tables["Concat"].Columns.Add("Periode");
                DS_Remplissage.Tables["Concat"].Columns["Periode"].Expression = DS_Remplissage.Tables["Trimestre"].ToString() + ", "
                                                                              + DS_Remplissage.Tables["Annee"].ToString();

                return DS_Remplissage;
            }
            catch
            {
                return DS_Remplissage; // vous en faites pas, c'est normal :p lol
            }
        }


Je pense que mon soucis vient du .expression, mais je ne vois pas vraiment.

Je n'ai pas pratiqué le C# depuis longtemps, si quelqu'un pouvait me raffraichir la mémoire, éclairer ma lanterne et surtout corriger mes erreurs, je lui en serais très reconnaissant ^^'



Cordialement, Gaedarr.
Afficher la suite 

11 réponses

Répondre au sujet
Tupad 239 Messages postés lundi 5 décembre 2005Date d'inscription 27 août 2012 Dernière intervention - 2 avril 2012 à 10:24
+3
Utile
Une remarque: Tu devrais renommer ton champ Key car c'est un mot réservé sur la plupart des BDD.
Voici le code réarrangé:

#region Remplissage de la combobox anciennes rubriques
string strCommande = "SELECT DISTINCT Key, Trimestre + ' ' + Annee FROM rubriques WHERE rubriques.[Key] !=0";
List<OldSection> list = CommandeSQL.RemplissageAnciennesRubriques(strCommande);

cbbRubriques.DisplayMember = "Value";
cbbRubriques.ValueMember = "Key";
cbbRubriques.DataSource = list;
cbb.Refresh();
#endregion


public class OldSection
{
public string Value { get; set; }
public int Key { get; set; }
}


public List<OldSection> RemplissageAnciennesRubriques(string chaine_commande)
{
List<OldSection> list = new List<OldSection>();
    try
    {
        SqlCommand cmd = new SqlCommand(chaine_commande, ConnectionRessource);
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
list.Add(new OldSection () { Key reader.GetInt(0), Valuereader.GetString(1)});
}

reader.Dispose(); reader = null;
cmd.Dispose(); cmd = null;            
}
            catch
            {            
// Log ton exception, c'est toujours utile
}
return list;
        }
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Tupad
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 2 avril 2012 à 18:28
+3
Utile
Bonjour, en poussant un peu l'idée de Tupad:

public class OldSection
{
public string Value { get; set; }
public int Key { get; set; }
public string TexteAAfficher//propiété affectée au datamenber
   {
      return string.format("La valeur est {0}, la clé est {1}",Value, Key);
   }
}


Whismeril
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Whismeril
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 3 avril 2012 à 09:30
+3
Utile
Salut,

la concaténation sur MySQL ne se fait pas via l'opérateur '+', mais avec la fonction CONCAT(VARCHAR, VARCHAR [, VARCHAR, [..]])
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_jopop
Tupad 239 Messages postés lundi 5 décembre 2005Date d'inscription 27 août 2012 Dernière intervention - 2 avril 2012 à 09:40
0
Utile
Tu as besoin de réutiliser ton DS_remplissage avec ces données par la suite, parce que sinon, tu récupères beaucoup de données pour rien?
Commenter la réponse de Tupad
Gaedarr 50 Messages postés lundi 4 février 2013Date d'inscription 12 mars 2015 Dernière intervention - 2 avril 2012 à 09:53
0
Utile
Oui, je réutilise ce DS_remplissage, mais à la limiste, je peux faire une autre méthode.

Si tu as une idée pour récupérer au moins les trimestres et les années puis de les concaténer, alors ce serait déjà pas mal :)

Je cherche à afficher ces deux champs dans la combobox via le displaymember, mais vu qu'il ne prend qu'un seul argument, je suis un peu coincé.





Cordialement, Gaedarr.
Commenter la réponse de Gaedarr
Gaedarr 50 Messages postés lundi 4 février 2013Date d'inscription 12 mars 2015 Dernière intervention - 2 avril 2012 à 10:39
0
Utile
Je vais voir pour implémenter tout ça, je te tiens au courant, merci :)




Cordialement, Gaedarr.
Commenter la réponse de Gaedarr
Gaedarr 50 Messages postés lundi 4 février 2013Date d'inscription 12 mars 2015 Dernière intervention - 3 avril 2012 à 08:12
0
Utile
Bonjour,

N'ayant pas vraiment eu le temps de coder hier, j'en profite aujourd'hui, je vous donnerai des nouvelles dès que possible.

Merci pour votre aide.





Cordialement, Gaedarr.
Commenter la réponse de Gaedarr
Gaedarr 50 Messages postés lundi 4 février 2013Date d'inscription 12 mars 2015 Dernière intervention - 3 avril 2012 à 09:06
0
Utile
Alors en faisant Trimestre + ' ' + Annee, ça fait simplement une addition des deux, j'ai le premier trimestre par exemple en 2012 et il me ressort un 2013. Ce qu'il me faudrait, c'est un affichage genre "1er, 2012" pour premier trimestre 2012 en bref.

j'ai tenté de faire le select sans sélectionner la clef primaire mais uniquement trimestre et années, mais là, l'année est juste sauf qu'il n'y a pas de trimestre.

Je ne vois pas trop comment concaténer directement en spécifiant la chaine de commande.

Une tite idée ?





Cordialement, Gaedarr.
Commenter la réponse de Gaedarr
Tupad 239 Messages postés lundi 5 décembre 2005Date d'inscription 27 août 2012 Dernière intervention - 3 avril 2012 à 09:35
0
Utile
Tu sais me donner une idée du contenu de ta table et des types des champs que tu récupères?
Commenter la réponse de Tupad
Gaedarr 50 Messages postés lundi 4 février 2013Date d'inscription 12 mars 2015 Dernière intervention - 3 avril 2012 à 09:56
0
Utile
Ok,

Donc ça donnerait quelque chose comme

SELECT DISTINCT CONCAT_WS(' ',Trimestre,Annee) as Periode FROM `rubriques` WHERE `rubriques`.`ID_rubriques` !=0;

Et donc pour le displaymember, je suppose que de lui indiquer Periode devrait fonctionner ?







Cordialement, Gaedarr.
Commenter la réponse de Gaedarr
Gaedarr 50 Messages postés lundi 4 février 2013Date d'inscription 12 mars 2015 Dernière intervention - 3 avril 2012 à 10:42
0
Utile
En fait je récupère deux champs précisément. L'un est le trimestre donc un int et l'autre est un champ année que j'ai laissé en int pour avoir uniquement l'année.

Mais vos codes fonctionnent très bien maintenant que j'ai pu les mettre en place, j'avais besoin de récupérer le trimestre, puis l'année et de les afficher les deux dans la combobox via le displaymember, mais je dois dire que sans le concat, ça aurait été un peu plus corsé :)

Donc maintenant, voici en gros le code que j'ai et qui fonctionne pour ce que je recherche :

Remplissage de la combobox
#region Remplissage de la combobox anciennes rubriques

                string strCommande = "SELECT DISTINCT CONCAT_WS(' ',Trimestre,Annee) as Periode FROM `rubriques` WHERE `rubriques`.`ID_rubriques` !=0";
                
                List<OldSection> list = CommandeSQL.RemplissageAnciennesRubriques(strCommande);

                cbbRubriques.DisplayMember = "Value";
                cbbRubriques.ValueMember = "Key";
                cbbRubriques.DataSource = list;
                cbbRubriques.Refresh();

                #endregion


Suivi de
public List<OldSection> RemplissageAnciennesRubriques(string chaine_commande)
        {
            List<OldSection> list = new List<OldSection>();
            try
            {
                MySqlCommand cmd = new MySqlCommand(chaine_commande, ConnectionRessource);
                MySqlDataReader reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    list.Add(new OldSection() { Value = reader.GetString(0) });
                }

                reader.Dispose(); reader = null;
                cmd.Dispose(); cmd = null;
            }
            catch(MySqlException myEx)
            {
                // Log ton exception, c'est toujours utile
                MessageBox.Show(myEx.ToString(),"Erreur Sql");
            }
            return list;
        }


Une tite classe à part
class OldSection
    {
        public string Value { get; set; }
        public int Key { get; set; }
    }



Et pour l'instant tout fonctionne très bien, la combobox affiche bien 1 2012 pour le premier trimestre de 2012 :)

Merci pour votre aide, vous m'avez bien rendu service ^^

Cordialement, Gaedarr.
Commenter la réponse de Gaedarr

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.