Введенный <T> C# usercontrol в режиме проектирования дает ошибку

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

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

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

  • Не удалось найти тип 'PresentrBuilder. Формы. Галерея'. Удостоверьтесь, что на блок, который содержит этот тип, ссылаются. Если этот тип является частью Вашего проекта разработки, удостоверьтесь, что проект был успешно разработан.

  • Переменная 'pictureGallery' является или необъявленной или никогда не присваивалась.

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

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

7
задан Laurent Etiemble 17 December 2009 в 09:21
поделиться

4 ответа

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

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

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

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

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

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

12
ответ дан 6 December 2019 в 06:36
поделиться

Sometimes the easiest thing to do in this case is to make an empty subclass that qualifies the generic parameter.

This is often done with the ObservableCollection:

public class SomeItemCollection : ObservableCollection<SomeItem>{

}

It is kind of irritating, but it may solve your problems.

11
ответ дан 6 December 2019 в 06:36
поделиться

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

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

public class PictureElementGallery : Gallery<PictureElement>

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

3
ответ дан 6 December 2019 в 06:36
поделиться

Instead of having a generic control, have the control interact with a generic class that is separate from the control itself. Then pass this class into the control.

1
ответ дан 6 December 2019 в 06:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: