Combobox à colonnes multiples [Résolu]

Signaler
Messages postés
50
Date d'inscription
lundi 4 février 2013
Statut
Membre
Dernière intervention
12 mars 2015
-
Messages postés
50
Date d'inscription
lundi 4 février 2013
Statut
Membre
Dernière intervention
12 mars 2015
-
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.

11 réponses

Messages postés
239
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
27 août 2012
5
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;
        }
Messages postés
14474
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 juillet 2020
420
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
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
Salut,

la concaténation sur MySQL ne se fait pas via l'opérateur '+', mais avec la fonction CONCAT(VARCHAR, VARCHAR [, VARCHAR, [..]])
Messages postés
239
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
27 août 2012
5
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?
Messages postés
50
Date d'inscription
lundi 4 février 2013
Statut
Membre
Dernière intervention
12 mars 2015

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.
Messages postés
50
Date d'inscription
lundi 4 février 2013
Statut
Membre
Dernière intervention
12 mars 2015

Je vais voir pour implémenter tout ça, je te tiens au courant, merci :)




Cordialement, Gaedarr.
Messages postés
50
Date d'inscription
lundi 4 février 2013
Statut
Membre
Dernière intervention
12 mars 2015

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.
Messages postés
50
Date d'inscription
lundi 4 février 2013
Statut
Membre
Dernière intervention
12 mars 2015

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.
Messages postés
239
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
27 août 2012
5
Tu sais me donner une idée du contenu de ta table et des types des champs que tu récupères?
Messages postés
50
Date d'inscription
lundi 4 février 2013
Statut
Membre
Dernière intervention
12 mars 2015

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.
Messages postés
50
Date d'inscription
lundi 4 février 2013
Statut
Membre
Dernière intervention
12 mars 2015

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.