Невозможно разместить пользовательский элемент управления в форме - PullRequest
33 голосов
/ 26 января 2011

Я создал приложение C # WinForms, используя VS2010. Я новичок в создании пользовательских элементов управления, поэтому я создал новый пользовательский элемент управления (как часть того же проекта).

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

Не удалось загрузить элемент панели инструментов 'TagGroup'. Он будет удален из панели инструментов.

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

Кто-нибудь может подсказать, куда мне смотреть дальше?

Ответы [ 8 ]

34 голосов
/ 23 апреля 2013

Мое приложение должно быть 64-битным. Чтобы использовать пользовательские элементы управления в конструкторе, я просто добавил новый проект в свое решение. Этот новый проект использует настройку AnyCPU и содержит все мои пользовательские элементы управления.

Мое решение содержит следующие проекты:

  • MyApp , который является моим основным проектом (Windows Form Application), скомпилированным в 64-bit и ссылающимся на мой второй проект
  • MyApp.UI.UserControls (библиотека классов) скомпилирована для " Любой процессор " и содержит все мои пользовательские элементы управления

Работает как шарм и чисто


Кстати, есть статья поддержки Microsoft об этой проблеме.

  • Действие: вы пытаетесь использовать 64-разрядный компонент в интегрированной среде разработки (IDE) Microsoft Visual Studio.
  • Причина ошибки: это поведение является заданным. Visual Studio - это 32-разрядный процесс, поэтому он может выполнять только 32-разрядные модули. Хотя Visual Studio позволяет добавлять ссылку на 64-разрядную сборку, на самом деле JIT не может скомпилировать ее в 64-разрядную и выполнить в процессе.
  • Разрешение:
    1. Перестройте сборку, используя параметр «AnyCPU». Это позволило бы компонент для запуска в 32-битном процессе (например, Visual Studio) или в 64-битном процессе.
    2. Добавьте сборку в качестве ссылки и динамически загрузите элемент управления в время выполнения. Хотя вы все равно не сможете использовать контролировать в любом дизайнере в Visual Studio, вы все еще можете написать код, необходимый для создания экземпляра элемента управления и установить его свойства соответственно.

Источник: http://support.microsoft.com/kb/963017

33 голосов
/ 27 января 2011

Я наконец понял это.

В проекте, с которым я работаю, используются две сборки библиотеки классов.Хотя они не имеют ничего общего с элементом управления, который я обсуждаю, я посмотрел и увидел, что в обеих библиотеках для Platform Target на вкладке Свойства | Сборка установлено значение «Любой процессор».

С другой стороны, мое приложение имелоэтот параметр установлен на «x64».Изменив настройку моего приложения на «Любой процессор», я теперь могу размещать пользовательские элементы управления на своих формах.

Перейти рисунок ...

6 голосов
/ 23 мая 2013

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

Решение, которое я придумал, было:используйте дизайнер форм, я изменяю настройку на x86.Сделайте работу, затем вернитесь к x64 и протестируйте.Проблема возникает только с конструктором, но решение собирается и работает нормально.

4 голосов
/ 21 декабря 2015

У меня была эта проблема в VS2015, и решение оказалось простым.

Я создал пользовательский элемент управления, вырезав и вставив несколько существующих элементов управления из формы (с целью группировки их в пользовательский элемент управления). Пользовательский элемент управления был в порядке (без ошибок компиляции), однако удаление элементов управления из существующей формы означало, что приложение не будет компилироваться. Конечно, невозможность добавить новый элемент управления означала, что я не смог обновить код, ссылающийся на предыдущие элементы управления, на код, ссылающийся на пользовательский элемент управления.

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

2 голосов
/ 02 апреля 2013

Та же проблема здесь. Я предполагаю, что это связано с тем фактом, что VS2010, установленный на x64 OS, все еще является 32-битной программой в сердце.

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

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

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

0 голосов
/ 03 июля 2017

Час запутанного, утомительного устранения неполадок в 3:36 утра снова легко решается с новым умом на следующий день!
Я исправил простую орфографическую ошибку в имени элемента управления, так что теперь он соответствует имени UserControl, очищается и перестраивается, а Бобс - кот вашего странного дяди. :]

0 голосов
/ 15 сентября 2016

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

Хотя это прекрасно работает во время выполнения, он сгенерировал вышеупомянутое исключение в DesignВремя.(Исключение инициализации типа с Исключением загрузки типа в качестве внутреннего исключения).

0 голосов
/ 14 июля 2016

Перейдите в свойство проекта, перейдите на вкладку «Построить» и проверьте, что «Целевая платформа» была «AnyCPU».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...