Erreur « Impossible de trouver le type » lors du chargement d'un formulaire dans le Concepteur Windows Forms

StackOverflow https://stackoverflow.com/questions/9314

Question

J'ai une application Windows Forms .NET 2.0, qui utilise beaucoup le ListView contrôle.

J'ai sous-classé le ListView classe dans un modèle SortableListView<T> classe, il peut donc être un peu plus intelligent dans la façon dont il affiche les choses et s'auto-trie.

Malheureusement, cela semble casser le concepteur de formulaires Visual Studio, à la fois dans VS2005 et 2008.

Le programme se compile et fonctionne correctement, mais lorsque j'essaie d'afficher le formulaire propriétaire dans le concepteur, j'obtiens ces erreurs :

  • Impossible de trouver le type « MyApp.Controls.SortableListView ».Veuillez vous assurer que l'assembly qui contient ce type est référencé.Si ce type fait partie de votre projet de développement, assurez-vous que le projet a été construit avec succès.

Aucune trace de pile ou information de ligne d'erreur n'est disponible pour cette erreur

  • La variable « listViewImages » n'est pas déclarée ou n'a jamais été attribuée.

Sur MyApp.Main.Designer.cs Ligne : XYZ Colonne : 1

Call stack:
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.Error(IDesignerSerializationManager manager, String exceptionText, String helpLink)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager, String name, CodeExpression expression)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager, String name, CodeExpression expression)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager, CodeStatement statement) 

La ligne de code en question est l'endroit où elle est réellement ajoutée au formulaire et est

this.imagesTab.Controls.Add( this.listViewImages );

listViewImages est déclaré comme

private MyApp.Controls.SortableListView<Image> listViewImages;

et est instancié dans le InitializeComponent méthode comme suit :

this.listViewImages = new MyApp.Controls.SortableListView<Image>();

Comme mentionné précédemment, le programme se compile et fonctionne parfaitement, et j'ai essayé de déplacer le SortableListView classe dans un assembly séparé afin qu'il puisse être compilé séparément, mais cela ne fait aucune différence.

Je ne sais pas ou aller d'ici.Toute aide serait appréciée!

Était-ce utile?

La solution 3

lorsque vous avez ajouté la liste, l'avez-vous ajoutée à la boîte à outils, puis l'avez-vous ajoutée au formulaire ?

Non, je viens de modifier Main.Designer.cs et je l'ai changé de System.Windows.Forms.ListView à MyApp.Controls.SortableListView<Image>

Soupçonner que cela pourrait être dû aux génériques m'a amené à trouver une solution.

Pour chaque classe pour laquelle je dois créer un SortableListView, j'ai défini une « classe stub » comme celle-ci

class ImagesListView : SortableListView<Image> { }

Puis fait le Main.Designer.cs le fichier fait référence à ces classes de stub au lieu du SortableListView.

Cela fonctionne maintenant, hourra !

Heureusement, je suis capable de le faire car tous mes types sont connus à l'avance et j'utilise uniquement le SortableListView comme méthode de réduction du code en double.

Autres conseils

Cela m'est arrivé à cause de l'architecture x86/x64.

Étant donné que Visual Studio (l'outil de développement lui-même) n'a pas de version x64, il n'est pas possible de charger le contrôle x64 dans le concepteur GUI.

La meilleure approche pour cela pourrait consister à régler l'interface graphique sous x86 et à la compiler pour x64 si nécessaire.

J'ai eu un problème comme celui-ci (bien que ce ne soit pas le même) dans le passé, où mon contrôle se trouvait dans un espace de noms différent de mon formulaire, même s'il se trouvait dans le même projet.Pour résoudre ce problème, j'ai dû ajouter un

using My.Other.Namespace;

en haut du fichier de code généré par le concepteur.Le plus ennuyeux, c'est qu'il continuait à être époustouflé lorsque le concepteur régénérait la page.

J'ai également eu ce problème, lié à la fusion de modifications massives du SVN (avec conflits) dans le fichier *.Designer.cs.La solution consistait simplement à ouvrir graphiquement la vue de conception, à modifier un contrôle (le déplacer vers la gauche puis à droite) et à réenregistrer la conception.Le fichier *.Designer.cs a changé comme par magie et l'avertissement a disparu lors de la compilation suivante.

Pour être clair, vous devez d’abord résoudre tous les problèmes de fusion de code.C'est juste une solution pour forcer VS à les recharger.

L'assembly qui contient MyApp.Controls.SortableListView n'est pas installé dans le GAC, par hasard, n'est-ce pas ?

lorsque vous avez ajouté la liste, l'avez-vous ajoutée à la boîte à outils, puis l'avez-vous ajoutée au formulaire ?

Peut-être as-tu oublié d'ajouter ceci :

    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Release all resources used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be removed otherwise; false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    private void InitializeComponent()
    {
        // ...
        this.components = new System.ComponentModel.Container(); // Not necessarily, if You do not use
        // ...
    }

J'avais quelque chose de similaire - un contrôle utilisateur faisait référence à un service distant (dont je ne pouvais pas garantir la disponibilité au moment de la conception).

Cet article sur MSDN m'a suggéré d'ajouter

if (this.DesignMode) return;

à la fonction Load du contrôle, ou dans mon cas jusqu'au point précédant l'initialisation du client WCF.Cela a fait l'affaire.

Donc

private readonly Client _client = new Client();

devient

private Client _client;

public new void Load()
{
    if(DesignMode) return;
    _client = new Client();
}

J'ai eu le même problème.Dans mon cas, ce problème était dû à l'initialisation des ressources.J'ai déplacé le code suivant de InitializeComponent méthode vers ctor (Après avoir appelé InitializeComponent).Après cela, ce problème a été résolu :

this->resources = (gcnew System::ComponentModel::ComponentResourceManager(XXX::typeid));

J'ai eu le même problème.Après avoir supprimé certains de mes propres contrôles du fichier *.Designer.cs, le problème a été résolu.Après être revenu au code d'origine, le problème était toujours résolu.Il semble donc que ce soit un problème avec le cache Visual Sudio.Pour le moment, je ne parviens pas à reproduire ce problème.

Si vous rencontrez un problème, essayez de vider le dossier

C:\Users\VOTRENOM\AppData\Local\Microsoft\VisualStudio\VERSION\Designer\ShadowCache

Est-ce que ça a marché ?

Dans mon cas, le problème était le nom du dossier de mon projet !Pourquoi je pense ça :J'utilise SVN et dans le 'trunk\SGIMovel' fonctionne parfaitement.Mais dans un dossier de branche nommé « OS#125\SGIMovel », je ne peux pas ouvrir le concepteur pour un formulaire qui utilise un contrôle personnalisé et fonctionne dans le dossier tronc.

Descendez simplement du # et ça marche bien.

Merci pour rien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top