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

У меня есть приложение Windows Forms .NET 2.0, которое интенсивно использует 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)

Решение

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

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

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

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

class ImagesListView : SortableListView<Image> { }

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

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

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

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

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

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

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

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

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

Просто сойди с # и отлично работает.

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

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

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

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

C: \ Users \ ВАШЕ ИМЯ \ AppData \ Local \ Microsoft \ VisualStudio \ VERSION \ Designer \ ShadowCache

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

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

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

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

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

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

using My.Other.Namespace;

в верхнюю часть созданного дизайнером файла кода. Досадно было то, что когда дизайнер регенерировал страницу, все начинало улетать.

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

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

if (this.DesignMode) return;

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

Так

private readonly Client _client = new Client();

становится

private Client _client;

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