C # набрал <T>usercontrol в режиме конструктора выдает ошибку - PullRequest
7 голосов
/ 17 декабря 2009

У меня есть пользовательский класс, производный от UserControl. Код:

public partial class Gallery<T> : UserControl where T : class, IElement, new()

Этот класс работает так, как будто он должен работать. Но когда я пытаюсь войти в режим разработки формы, которая содержит эти Gallery классы, это выдает мне ошибки:

  • Не удалось найти тип «PresentrBuilder.Forms.Gallery». Пожалуйста, убедитесь, что сборка на который ссылается этот тип. Если этот тип является частью вашего проект развития, убедитесь, что проект был успешно встроенный.

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

Примечание: (pictureGallery на самом деле Gallery<PictureElement>).

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

Ответы [ 4 ]

12 голосов
/ 17 декабря 2009

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

Например, если у вас есть:

public Type ControlType {get;set;} // comparable to T in the original

Вы можете использовать:

IElement el = (IElement) Activator.CreateInstance(ControlType);

Это даст вам все, что у вас есть в данный момент (new, IElement и т. Д.), Но просто не может выполнить проверку во время компиляции.

11 голосов
/ 17 декабря 2009

Иногда в этом случае проще всего создать пустой подкласс, который квалифицирует универсальный параметр.

Это часто делается с помощью ObservableCollection:

public class SomeItemCollection : ObservableCollection<SomeItem>{

}

Это немного раздражает, но может решить ваши проблемы.

3 голосов
/ 17 декабря 2009

Как и другие заявили, Visual Studio Designer имеет много проблем при обработке обобщенных элементов в элементах управления. Я сам столкнулся с этим, пытаясь реализовать что-то вроде универсального класса 'viewer'.

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

public class PictureElementGallery : Gallery<PictureElement>

Затем используйте PictureElementGallery в вашей форме вместо Галерея . У дизайнера не должно быть проблем с этим.

1 голос
/ 17 декабря 2009

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

...