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

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

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

К сожалению, это, похоже, нарушает работу Visual Studio Forms Designer как в 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класс в отдельную сборку, чтобы он мог быть скомпилирован отдельно, но это не имеет значения.

Я понятия не имею, куда идти отсюда. Любая помощь будет оценена!

12.08.2008 23:17:00
11 ОТВЕТОВ

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

using My.Other.Namespace;

в начало созданного дизайнером файла кода. Раздражает то, что он все время сдувается, когда дизайнер восстанавливает страницу.

6
12.08.2008 23:33:06
Та же проблема в VS2013, в конечном итоге исправленная путем изменения целевой платформы сборки на Любой ЦП с x64. Удаление bin и obj dirs вызвало больше проблем.
SimonKravis 23.12.2018 21:16:31

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

2
13.08.2008 00:22:44

Когда вы добавили просмотр списка, вы добавили его в панель инструментов, а затем добавили в форму?

2
13.08.2008 01:07:15
РЕШЕНИЕ

Когда вы добавили просмотр списка, вы добавили его в панель инструментов, а затем добавили в форму?

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

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

Для каждого класса, для которого мне нужно создать SortableListView, я определил «класс-заглушку», как этот

class ImagesListView : SortableListView<Image> { }

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

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

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

9
14.03.2013 20:09:48
Привет, Орион ... У меня та же проблема, что ты упомянул выше ... Я не смог понять часть "Для каждого класса, для которого мне нужно создать SortableListView, я определил" класс-заглушку ", как этот класс ImagesListView : SortableListView <Image> {} "что вы сделали, чтобы решить эту проблему? Вы можете объяснить в деталях? Вы создали другой новый класс, а затем передали его в designer.cs?
Gowtham Ramamoorthy 21.04.2016 17:24:03

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

Этот пост на 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();
}
1
18.08.2009 10:52:14

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

    /// <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
        // ...
    }
2
31.07.2012 21:02:30

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

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

5
17.07.2016 13:40:06
Это просто неправда. Если вы получите какое-либо из этих предупреждений, то графическое представление будет нарушено. Ничто не покажет, и поэтому вы не можете «передвинуть что-то, чтобы волшебным образом это исправить». Есть только список ошибок и нет графического интерфейса, как жалуется оператор.
Dirk Bester 13.03.2013 05:19:34
Я категорически не согласен; это сработало для меня как очарование (используя Framework 4.0). При первоначальном отображении предупреждений дизайнера, появляющихся в течение нескольких секунд, форма была нарисована правильно. Я добавил кнопку, удалил ее и перестроил решение; все предупреждения исчезли.
Pieter Geerkens 16.03.2013 16:51:32
Дирк - вы можете подумать, что это неправда, но это то, что случилось со мной. Я потратил часы, чтобы попытаться это исправить. Я хотел бы иметь до и после версии файла Designer.cs, но у меня нет. Ясно, что в Visual Studio есть ошибка, которая не обновляет должным образом некоторые внутренние метаданные, и я нашел единственный способ исправить это - принудительно обновить, сохранив графическое представление.
Mark Lakata 18.03.2013 18:21:22
Пожалуйста, не голосуйте, если считаете, что это неправда. В Visual Studio есть ошибка, связанная с кэшированием файлов дизайна, и это обходной путь. Конечно, вам нужно сначала исправить ошибки, а затем проделать это, чтобы обойти Visual Studio.
Mark Lakata 17.07.2016 13:38:43

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

Просто сойти с # и работает хорошо.

Спасибо за ничего.

-3
17.10.2013 13:59:44

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

this->resources = (gcnew System::ComponentModel::ComponentResourceManager(XXX::typeid));
1
19.11.2013 12:15:58

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

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

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

30
11.05.2017 06:06:20
Конечно, изменение моего целевого процессора на x86 устранило эту проблему для меня. Спасибо!
johnnyRose 17.03.2017 17:39:39
Это такая полная BS со стороны Microsoft.
Dr. Cogent 8.05.2017 21:20:08
Я действительно хочу 64-разрядную версию Visual Studio.
user2033412 10.08.2017 19:55:31

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

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

C: \ Users \ ВашеИмя \ AppData \ Local \ Microsoft \ VisualStudio \ версия \ Конструктор \ ShadowCache

Это сработало?

2
3.02.2017 08:41:03
У меня была проблема с загрузкой конструктора (VS 2017, .NET 4.7.1), который я запустил на другой машине. Конструктор пользовательских элементов управления был в порядке, он скомпилировался нормально, но дизайнер форм не загружался правильно, пока я не удалил ShadowCache.
Eric P. 28.10.2019 14:26:29