Ошибка “Не удалось найти тип” при загрузке формы в конструкторе Windows Forms

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

Вопрос

У меня есть приложение .NET 2.0 для Windows forms, которое интенсивно использует ListView контроль.

Я разделил их на подклассы ListView класс в шаблонный SortableListView<T> class, чтобы он мог быть немного умнее в отношении того, как он отображает объекты, и сортировать сам себя.

К сожалению, это, похоже, нарушает работу конструктора форм Visual Studio как в VS2005, так и в 2008.

Программа компилируется и работает нормально, но когда я пытаюсь просмотреть форму владельца в конструкторе, я получаю эти ошибки:

  • Не удалось найти тип 'MyApp.Controls.SortableListView'.Пожалуйста, убедитесь, что есть ссылка на сборку, содержащую этот тип.Если этот тип является частью вашего проекта разработки, убедитесь, что проект был успешно собран.

Для этой ошибки недоступна трассировка стека или информация о строке ошибки

  • Переменная 'listViewImages' либо не объявлена, либо никогда не назначалась.

В MyApp.Main.Designer.cs Строка: XYZ Столбец: 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) 

Строка кода, о которой идет речь, находится там, где она фактически добавляется в форму, и является

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

listViewImages объявляется как

private MyApp.Controls.SortableListView<Image> listViewImages;

и создается в InitializeComponent способ заключается в следующем:

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

Как упоминалось ранее, программа компилируется и работает отлично, и я попытался изменить SortableListView выделите класс в отдельную сборку, чтобы ее можно было скомпилировать отдельно, но это не имеет никакого значения.

Я понятия не имею, куда идти дальше.Мы будем признательны за любую помощь!

Это было полезно?

Решение 3

когда вы добавляли listview, вы добавляли его в toolbox, а затем добавляли в форму?

Нет, я только что отредактировал Main.Designer.cs и изменил его с System.Windows.Forms.ListView Для MyApp.Controls.SortableListView<Image>

Подозрение, что это могло быть связано с дженериками, привело меня к тому, что я действительно нашел решение.

Для каждого класса, для которого мне нужно создать SortableListView, я определил "класс-заглушку" следующим образом

class ImagesListView : SortableListView<Image> { }

Затем сделал следующее Main.Designer.cs файл ссылается на эти классы-заглушки вместо SortableListView.

Теперь это работает, ура!

К счастью, я могу это сделать, потому что все мои типы известны заранее, и я использую только SortableListView как метод сокращения дублирующегося кода.

Другие советы

Это случилось со мной из-за архитектуры x86 / x64.

Поскольку Visual Studio (само средство разработки) не имеет версии x64, загрузить элемент управления x64 в GUI designer невозможно.

Лучшим подходом для этого может быть настройка GUI под x86 и компиляция его для x64, когда это необходимо.

У меня была подобная проблема (хотя и не такая же) в прошлом, когда мой элемент управления находился в другом пространстве имен, отличном от моей формы, даже если он был в том же проекте.Чтобы исправить это, мне пришлось добавить

using My.Other.Namespace;

в начало файла кода, сгенерированного дизайнером.Самым досадным было то, что его постоянно уносило ветром, когда дизайнер восстанавливал страницу заново.

У меня тоже была эта проблема, связанная с объединением массивных изменений SVN (с конфликтами) в файле * .Designer.cs.Решение состояло в том, чтобы просто открыть графическое представление дизайна, отредактировать элемент управления (переместить его влево, затем вправо) и повторно сохранить дизайн.Файл *.Designer.cs волшебным образом изменился, и предупреждение исчезло при следующей компиляции.

Чтобы внести ясность, сначала вам нужно устранить все проблемы со слиянием кода.Это просто способ заставить VS перезагрузить их.

Сборка, которая содержит MyApp.Controls.SortableListView, случайно, не установлена в GAC, не так ли?

когда вы добавляли listview, вы добавляли его в toolbox, а затем добавляли в форму?

Возможно, вы забыли добавить, что:

    /// <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
        // ...
    }

У меня было нечто подобное - пользовательский элемент управления ссылался на удаленный serice (который я не мог гарантировать, что он будет доступен во время разработки).

Этот пост на MSDN предложил мне добавить

if (this.DesignMode) return;

к функции загрузки элемента управления, или, в моем случае, к точке, предшествующей инициализации клиента WCF.Это сделало свое дело.

Итак

private readonly Client _client = new Client();

становится

private Client _client;

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

У меня была такая же проблема.В моем случае эта проблема была связана с инициализацией ресурса.Я перенес следующий код из InitializeComponent метод для ctor(После вызова InitializeComponent).После этого этот вопрос был решен:

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

У меня была такая же проблема.После удаления некоторых моих собственных элементов управления из файла *.Designer.cs проблема была решена.После возврата к исходному коду проблема все же была решена.Так что, похоже, это проблема с визуальным кэшем Sudio.На данный момент я не могу воспроизвести эту проблему.

Если у вас возникла проблема, попробуйте удалить папку

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

Сработало ли это?

В моем случае проблема заключалась в названии папки моего проекта!Почему я так думаю:Я использую SVN, и в 'trunk\SGIMovel' все работает отлично.Но в папке филиала с именем 'OS # 125 \ SGIMovel' я не могу открыть конструктор для формы, которая использует пользовательский элемент управления и работает в папке trunk.

Просто уберите # и все будет хорошо работать.

Спасибо ни за что.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top