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

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

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

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

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

Ответы [ 11 ]

24 голосов
/ 18 ноября 2015

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

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

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

6 голосов
/ 13 августа 2008

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

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

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

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

class ImagesListView : SortableListView<Image> { }

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

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

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

6 голосов
/ 13 августа 2008

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

using My.Other.Namespace;

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

5 голосов
/ 31 августа 2012

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

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

2 голосов
/ 01 августа 2012

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

    /// <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 голосов
/ 13 августа 2008

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

2 голосов
/ 13 августа 2008

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

1 голос
/ 03 февраля 2017

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

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

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

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

1 голос
/ 19 ноября 2013

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

this->resources = (gcnew System::ComponentModel::ComponentResourceManager(XXX::typeid));
1 голос
/ 18 августа 2009

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

В этом сообщении на MSDN предлагается добавить

if (this.DesignMode) return;

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

So

private readonly Client _client = new Client();

становится

private Client _client;

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