Mettre une enum dans un combobox [Résolu]

cs_cedkat 172 Messages postés mardi 7 janvier 2003Date d'inscription 3 juin 2011 Dernière intervention - 9 févr. 2007 à 10:16 - Dernière réponse : cs_cedkat 172 Messages postés mardi 7 janvier 2003Date d'inscription 3 juin 2011 Dernière intervention
- 12 févr. 2007 à 13:51
Bonjour,

Comment est-il possible de mettre une énumération dans un comboBox ?

Merci

CedKat
Afficher la suite 

5 réponses

Répondre au sujet
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 9 févr. 2007 à 11:03
+3
Utile
C'est "un peu" plus compliqué

Il faut que pour chaque item de ton Enum tu ajoutes un attribut [Description("blabla")]
Et suivre le code suivant :


Type t = typeof(MonEnum);
MemberInfo[] mis;
string description;
MonEnumItemType item;
List<MonEnumItemType> items = new List<MonEnumItemType>();

foreach(MonEnum v in Enum.GetValues(t)) {
   item = new MonEnumItemType();
   mis = t.GetMember(v.ToString());

   item.Value = v;
   item.Description = v.ToString();

   if (mis.Length > 0) {
      DescriptionAttribute[] da = (DescriptionAttribute[])mis[0].GetCustomAttributes(typeof(DescriptionAttribute), true);
      if (da.Length > 0) {
         item.Description = da[0].Description;
      }
   }
   items.Add(item);
}

comboBox1.DataSource = items;
comboBox1.DisplayMember = "Description";
comboBox1.ValueMember = "Value";

Avec MonEnumItemType défini comme suit :

public struct MonEnumItemType {
   public MonEnum Value;
   public string Description;

   public override string ToString() {
      return this.Description;
   }
}

Je posterai une source la dessus quand j'aurai un peu de temps.

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de sebmafate
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 9 févr. 2007 à 10:39
0
Utile
Bonjour,

Oui... j'ai fait une source qui fait ça...
http://www.csharpfr.com/codes/UTILISATION-PROPERTYGRID_34356.aspx
Bon ok... faut chercher ;)

En gros voici comment ca se passe :

Tu as une enum de type MonEnum et une ComboBox comboBox.

foreach(object e in Enum.GetValues(typeof(MonEnum)) {
   comboBox.Items.Add(e);
}

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Commenter la réponse de sebmafate
cs_cedkat 172 Messages postés mardi 7 janvier 2003Date d'inscription 3 juin 2011 Dernière intervention - 9 févr. 2007 à 10:48
0
Utile
Bonjour,

Merci pour ta réponse, mais comment avoir un texte plus clair dans le combobox ?

CedKat
Commenter la réponse de cs_cedkat
cs_cedkat 172 Messages postés mardi 7 janvier 2003Date d'inscription 3 juin 2011 Dernière intervention - 9 févr. 2007 à 12:11
0
Utile
Je me suis servi de ton code pour essayer de faire une classe générique que voici :

public
class
Enumeration<T>
{
    
public
struct
EnumItem
    {
       
public T Value;
       
public
string Description;

       
public
override
string ToString()
      {
         
return
this.Description;
      }
   }   

   public
static
void SetCombobox(
ComboBox cbx)
   {
      
Type t =
typeof(T);
      
      
if (!t.IsEnum)
         
throw
new
Exception(
"Le type n'est pas une ‚num‚ration.");

      
List<
EnumItem> items =
new
List<
EnumItem>();
      
EnumItem item;

      
foreach (T v
in
Enum.GetValues(t))
      {
         item =
new
EnumItem();
         
MemberInfo[] mis = t.GetMember(v.ToString());
         item.Value = v;
         item.Description = v.ToString();
         
if (mis.Length > 0)
         {   
            
DescriptionAttribute[] da = (
DescriptionAttribute[])mis[0].GetCustomAttributes(
typeof(
DescriptionAttribute),
true);
            
if (da.Length > 0)
            {
               item.Description = da[0].Description;   
            }
         }
         items.Add(item);
      }
      cbx.DataSource = items;
      cbx.DisplayMember =
"Description";
      cbx.ValueMember =
"Value";
   }
}
Mais voila en exécution, une exception est levée lorsqu'il fait la liaison sur "Value" voici l'exception :
System.ArgumentException was unhandled
  Message="Liaison au nouveau membre Display impossible.\r\nNom du paramètre : newDisplayMember"
  Source="System.Windows.Forms"
  ParamName="newDisplayMember"
  StackTrace:
       à System.Windows.Forms.ListControl.SetDataConnection(Object newDataSource, BindingMemberInfo newDisplayMember, Boolean force)
       à System.Windows.Forms.ListControl.set_ValueMember(String value)
       à Arcade.Systèm.Enumeration`1.SetCombobox(ComboBox cbx) dans ligne 54
       à S1Xml.frmMain.frmMain_Load(Object sender, EventArgs e) dans ligne 42
       à System.Windows.Forms.Form.OnLoad(EventArgs e)
       à System.Windows.Forms.Form.OnCreateControl()
       à System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
       à System.Windows.Forms.Control.CreateControl()
       à System.Windows.Forms.Control.WmShowWindow(Message& m)
       à System.Windows.Forms.Control.WndProc(Message& m)
       à System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       à System.Windows.Forms.ContainerControl.WndProc(Message& m)
       à System.Windows.Forms.Form.WmShowWindow(Message& m)
       à System.Windows.Forms.Form.WndProc(Message& m)
       à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       à System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
       à System.Windows.Forms.Control.SetVisibleCore(Boolean value)
       à System.Windows.Forms.Form.SetVisibleCore(Boolean value)
       à System.Windows.Forms.Control.set_Visible(Boolean value)
       à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       à System.Windows.Forms.Application.Run(Form mainForm)
       à S1Xml.Program.Main() dans ligne 17
       à System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
       à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       à System.Threading.ThreadHelper.ThreadStart()

Aurais-tu une idées ?

Et encore merci pour ton aide.

CedKat
Commenter la réponse de cs_cedkat
cs_cedkat 172 Messages postés mardi 7 janvier 2003Date d'inscription 3 juin 2011 Dernière intervention - 12 févr. 2007 à 13:51
0
Utile
Bonjour,

Je n'ai trouvé aucune solution au problème alors j'ai tester ton code exactement comme tu l'as décrit mais j'ai le meme problème avec l'erreur suivante :
"Liaison au nouveau membre Display impossible.
Nom du paramètre : newDisplayMember"
lorsqu'il veut binder le "ValueMember".

Est-ce un problème de code ou un bug du framwork ?

Merci

CedKat
Commenter la réponse de cs_cedkat

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.