Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre régulier
    Inscrit en
    février 2004
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : février 2004
    Messages : 316
    Points : 113
    Points
    113

    Par défaut Réflexion combobox problème

    Bonjour à tous,

    Je suis en train d'essayer par le biais de la réflexion de recenser l'ensemble de fenêtres de mon application ainsi que leurs propriétés.
    Dans 90% des cas mon traitement fonctionne bien, mais j'ai un problème avec les fenêtres composées de combobox, notamment au niveau des propriétés "AutoCompleteSource" et "AutoCompleteMode".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    this.ccbStateTicket.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
    this.ccbStateTicket.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
    J'ai l'exception suivante qui est levée:
    > Exception has been thrown by the target of an invocation.
    > Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it.

    Une idée pourquoi ça ne fonctionne pas ?

    Voici mon code complet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
     
    foreach (Assembly a in assemblies)
                    {
                        Type[] types = a.GetTypes();
     
                        foreach (Type t in types)
                        {
                            if (t.BaseType == typeof(Form) && t.Name.StartsWith("Frm"))
                            {
                                try
                                {
                                    Form frm = (Form)Activator.CreateInstance(t);
                                }
                                catch (Exception ex) // -- Ici se lève l'exception pour certaines fenêtres
                                {                              
                                }
                            }
                        }
                    }

  2. #2
    Membre chevronné
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    mars 2005
    Messages
    1 231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2005
    Messages : 1 231
    Points : 2 013
    Points
    2 013

    Par défaut

    Tu exécute ce code dans une application console, non ?
    Dans ce cas, il suffit de faire ce que le message te dit de faire pour corriger le problème.

    Current thread must be set to single thread apartment (STA) mode before OLE calls can be made.
    Ensure that your Main function has STAThreadAttribute marked on it.
    Et donc,
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [STAThread]
     
    static void Main(string[] args)
     
    {
     
    }

    Sinon, ce sujet devrait t'intéresser.
    https://www.codeproject.com/Question...n-thrown-by-th

  3. #3
    Membre régulier
    Inscrit en
    février 2004
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : février 2004
    Messages : 316
    Points : 113
    Points
    113

    Par défaut

    J'exécute ce code depuis une fenêtre d'administration située dans la même application ...

  4. #4
    Membre éclairé
    Homme Profil pro
    x
    Inscrit en
    juin 2007
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : x

    Informations forums :
    Inscription : juin 2007
    Messages : 536
    Points : 885
    Points
    885

    Par défaut

    Oui mais tu ne ferais pas ta recherche de fenêtre dans un thread à part, ou avec des techniques basées sur le pool de threads ?

    Pour apporter quelques précisions, bien que je ne sois absolument pas un spécialiste du sujet (François Dorin pourra infirmer ou confirmer mes dires), un thread peut être lancé en mode cloisonné (Single Threaded Apartment) ou en mode partagé (Multi-Threaded Appartment). Quand tu crées une application WinForm dans Visual Studio tu remarqueras qu'il met un attribut [STAThread] sur la fonction Main(). Ce n'est pas tant un problème avec WinForm qu'avec COM (Component Object Model), qui est un standard Microsoft pour la gestion des objets partagés (entre processus, entre applications, par le réseau) qui sert à l'échange de données entre application. Beaucoup de composants COM sont créés pour fonctionner en mode STA. OLE (Object Linking and Embedding), une technologie qui sert au partage et à l'inclusion de données entre documents et applications (exemples : insérer un classeur Excel dans un document Word, faire une requête sur une base de données...), s'appuie sur COM, d'où le besoin d'utiliser des objets OLE en mode STA. Du coup j'imagine que certaines de tes fenêtres utilisent des objets COM/OLE (cf. ton message d'erreur) ce qui pose problème lorsqu'ils sont utilisés à partir d'un thread en mode MTA.

    Reste à préciser dans quel thread tu récupères tes fenêtres ; pour information le pool de thread est en mode MTA, donc tout ce qui s'appuie sur les Task ou async/await est en MTA. Par contre tu peux instancier un thread explicitement et le mettre en mode STA (thread.SetApartmentState(ApartmentState.STA)).

    Petit lien intéressant qui évoque entre autre ce sujet : archives du net

  5. #5
    Membre régulier
    Inscrit en
    février 2004
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : février 2004
    Messages : 316
    Points : 113
    Points
    113

    Par défaut

    En effet je fais ma recherche depuis une méthode asynchrone.
    Le problème pourrait donc venir de la...

    Voici comment j'exécute ma méthode de recherche en asynchrone.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                 try
                {
                    searchAppFormDelegate searchAppFormDelegate = new searchAppFormDelegate(searchFormInApp);
                    searchAppFormDelegate.BeginInvoke(null, null);
                }
                catch (Exception ex)
                {
                    throw new Exception("FrmViewGTMForms.beginSearchFormInApp : " + ex.Message, ex);
                }

  6. #6
    Membre éclairé
    Homme Profil pro
    x
    Inscrit en
    juin 2007
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : x

    Informations forums :
    Inscription : juin 2007
    Messages : 536
    Points : 885
    Points
    885

    Par défaut

    Deuxième et troisième phrases du premier paragraphe du lien que j'ai donné dans mon post précédent :
    There you learned how to dispatch an asynchronous method call by simply calling BeginInvoke on a delegate object. Executing methods asynchronously using delegates is easy because the common language runtime (CLR) creates and manages a pool of worker threads for you behind the scenes.
    On est bien sur le pool de thread. J'ai bien peur qu'il ne te faille passer directement par la case [Tutoriel sur les Thread] pour gérer ça "à la main".

  7. #7
    Membre régulier
    Inscrit en
    février 2004
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : février 2004
    Messages : 316
    Points : 113
    Points
    113

    Par défaut

    En exécutant la méthode en mode synchrone, je n'ai pas le problème.
    N'ayant pas le temps de rechercher comment faire cela en asynchrone je vais me contenter de cette solution.

    Merci.

  8. #8
    Membre régulier
    Inscrit en
    février 2004
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : février 2004
    Messages : 316
    Points : 113
    Points
    113

    Par défaut

    pour info ...
    La solution était simple comme bonjour en fait !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    this.Invoke((MethodInvoker)delegate()
    {
        frm = (Form)Activator.CreateInstance(t);
    });

  9. #9
    Membre éclairé
    Homme Profil pro
    x
    Inscrit en
    juin 2007
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : x

    Informations forums :
    Inscription : juin 2007
    Messages : 536
    Points : 885
    Points
    885

    Par défaut

    Il manque un peu de contexte mais je suppose que tu utilises le dispatcher du thread de l'UI pour lui passer la main au moment d'instancier la Form, celui-ci étant en mode STA.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ComboBox]Problème pour affecter une SelectedValue
    Par mordrhim dans le forum Windows Forms
    Réponses: 0
    Dernier message: 14/01/2010, 12h58
  2. comboBox problème avec l'evenement click
    Par label55 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 30/04/2008, 18h01
  3. ComboBox, problème de variable
    Par ia.jenny dans le forum Flash
    Réponses: 2
    Dernier message: 20/08/2007, 19h05
  4. ComboBox : problème sélection sensible à la casse
    Par pataguillon dans le forum MFC
    Réponses: 3
    Dernier message: 13/03/2007, 16h34
  5. [ComboBox] problème remplissage
    Par samtheh dans le forum MFC
    Réponses: 5
    Dernier message: 18/06/2006, 11h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo