web-dev-qa-db-fra.com

Impossible de placer le contrôle utilisateur sur le formulaire

J'ai créé une application C # WinForms à l'aide de VS2010. Je suis novice dans la création de contrôles utilisateur, j'ai donc créé un nouveau contrôle utilisateur (dans le cadre du même projet).

Lorsque je reconstruis le projet, le nouveau contrôle apparaît dans la boîte à outils. Et lorsque je déplace le contrôle de la boîte à outils vers un formulaire, l'erreur suivante apparaît.

Échec du chargement de l'élément de la boîte à outils 'TagGroup'. Il sera supprimé de la boîte à outils.

Cela s'est produit la seule autre fois où j'ai créé un contrôle utilisateur. J'ai effectué des recherches sur le Web, mais la plupart des réponses que j'ai trouvées semblaient liées au contrôle exercé dans une assemblée distincte. (Notez que j'ai trouvé beaucoup de questions avec le même problème que moi.)

Quelqu'un peut-il suggérer où je devrais regarder ensuite?

32
Jonathan Wood

J'ai finalement compris celui-ci.

Le projet sur lequel je travaille utilise deux assemblys de bibliothèques de classes. Bien que celles-ci n'aient rien à voir avec le contrôle dont je parle, j'ai regardé et vu que les deux bibliothèques avaient une cible de plate-forme dans l'onglet Propriétés | Construire définie sur "Tout processeur".

D'autre part, mon application avait ce paramètre défini sur "x64". En modifiant le paramètre de mon application sur "Tout processeur", je peux maintenant placer mes contrôles utilisateur sur mes formulaires.

Allez comprendre...

33
Jonathan Wood

Mon application doit être en 64 bits. Afin d'utiliser des contrôles utilisateur personnalisés dans le concepteur, je viens d'ajouter un nouveau projet à ma solution. Ce nouveau projet utilise le paramètre "AnyCPU" et contient tous mes contrôles utilisateur.

Ma solution contient les projets suivants:

  • MyApp qui est mon projet principal (Application Windows Form) compilé dans 64 bits et faisant référence à mon deuxième projet
  • MyApp.UI.UserControls (bibliothèque de classes) est compilé pour " Tout CPU " et contient tous mes contrôles utilisateur.

Fonctionne comme un charme et c'est propre


À propos, il existe un article de support technique Microsoft concernant ce problème.

  • Action: Vous essayez d'utiliser un composant 64 bits dans l'environnement de développement intégré de Visual Studio.
  • Cause de l'erreur: Ce problème est inhérent à conception. Visual Studio est un processus 32 bits et ne peut donc exécuter que des modules 32 bits. Bien que Visual Studio vous permette d'ajouter une référence à un assembly 64 bits, il ne peut pas réellement le compiler en 64 bits et l'exécuter en processus.
  • Résolution:
    1. Reconstruisez l'assemblage en utilisant le paramètre "AnyCPU". Ceci permettrait à Le composant de s'exécuter dans un processus 32 bits (tel que Visual Studio) ou dans un processus 64 bits.
    2. Ajoutez l'assembly en tant que référence et chargez le contrôle dynamiquement à l'exécution de . Bien que vous ne puissiez toujours pas utiliser le contrôle Dans un concepteur de Visual Studio, vous pouvez toujours Écrire le code nécessaire pour instancier le contrôle et définir ses propriétés En conséquence.

Source: http://support.Microsoft.com/kb/963017

33
Yves M.

J'ai eu ce problème aussi, mais la réponse ne pouvait pas me convenir. Mon projet a quelques problèmes, il ne peut cibler que x86 et x64 séparément. En d'autres termes, je ne peux pas utiliser la configuration AnyCPU (c'est parce que je référence différentes bibliothèques pour chaque configuration, car ces bibliothèques ne sont pas compatibles avec AnyCPU).

La solution que j'ai proposée est la suivante: lorsque je dois utiliser le concepteur de formulaire, je modifie le paramètre en x86. Faites le travail, puis réglez de nouveau sur x64 et testez. Le problème se produit uniquement avec le concepteur, mais la solution est générée et fonctionne correctement.

6
Daniel Möller

J'ai eu ce problème dans VS2015 et la solution s'est avérée simple.

J'avais créé un contrôle utilisateur en coupant et en collant quelques contrôles existants à partir d'un formulaire (dans le but de les regrouper dans le contrôle personnalisé). Le contrôle personnalisé était correct (aucune erreur de compilation), mais la suppression des contrôles du formulaire existant signifiait que l'application ne compilerait pas. Bien sûr, le fait de ne pas pouvoir ajouter le nouveau contrôle signifiait que je ne pouvais pas mettre à jour le code faisant référence aux contrôles précédents avec le code faisant référence au contrôle personnalisé.

Tout ce que je faisais était du hack and slash (mise en commentaire, création de contrôles temporaires, etc.) pour que toute l'application soit compilée. Après l'avoir compilé, j'ai découvert que je pouvais faire glisser le contrôle personnalisé sur le formulaire (sans l'erreur qui a provoqué cette question). J'ai ensuite dû décocher et débloquer pour que le code fasse correctement référence au nouveau contrôle personnalisé.

4
Andrew Jens

Même problème ici. Je suppose que cela est lié au fait que la VS2010 installée sur un système d'exploitation x64 est toujours un programme 32 bits dans le cœur. 

Une solution alternative que vous pouvez essayer est simplement d'ouvrir TheFormThisUserControlIsSupposedToBeAddedTo.Designer.cs et d'utiliser du code pour ajouter le contrôle utilisateur. En gros, vous faites le sale boulot que le concepteur est supposé faire. 

Ce n'est pas aussi difficile que ça en a l'air, surtout considérant que le fichier contient probablement déjà beaucoup d'exemples de code (par exemple, les boutons que vous avez ajoutés à l'aide de Designer). La seule partie difficile consiste à trouver les bonnes coordonnées dans le formulaire pour placer le contrôle. 

Le résultat final est que vous ne pouvez pas voir le contrôle utilisateur dans Desinger, mais ils sont ajoutés lors du débogage/exécution. 

2
lznt

Une heure de dépannage confus et fatigant à 3h36 est à nouveau facilement résolue avec un esprit neuf le lendemain!
J'ai corrigé une simple faute d'orthographe dans le nom du fichier du contrôle. Elle correspond donc maintenant au nom de UserControl, nettoyée, reconstruite et bobs le chat de l'oncle étrange. :]

0
n00dles

J'ai aussi rencontré ce problème mais la cause était différente. Dans mon cas, un constructeur de composant (formulaire) ou un événement Load a appelé ailleurs une méthode utilisant la réflexion pour rechercher toutes les classes implémentant une interface donnée.

Bien que cela fonctionne bien au moment de l'exécution, il a généré l'exception mentionnée ci-dessus au moment de la conception. (Exception d'initialisation de type avec une exception de type Load comme exception interne).

0
Lord of Scripts