Visual Studio 2008 Winform дизайнер не может загрузить форму, которая наследуется от универсального класса - PullRequest
12 голосов
/ 12 января 2010

У меня есть проект winforms, и я создал класс для сборки A , который наследуется от System.Windows.Forms.Form, чтобы служить базовым классом для различных форм в моем проекте, базовый класс выглядит примерно так:

public partial class DataForm<T> : Form where T : class
{

    T currentRecord;

    protected T CurrentRecord
    {
        get
        {
            return currentRecord;
        }
        set
        {
            currentRecord = value;
            CurrentRecordChanged();
        }
    }
}

Теперь, когда я создаю форму в сборке B , которая наследуется от моей DataForm, дизайнер не загружается, но если я скомпилирую ее, приложение будет работать нормально.

Форма выглядит так:

public partial class SomeTableWindow : DataForm<SomeTable>
{
    public SomeTableWindow ()
    {
        InitializeComponent();
    }
}

Ошибка, которую я получаю:

The designer could not be shown for this file because none of the classes within it can be designed. 
The designer inspected the following classes in the file: CultivosWindow --- The base
class 'TripleH.Erp.Controls.DataForm' could not be loaded. Ensure the assembly has 
been referenced and that all projects have been built.    


Instances of this error (1)  

1.   Hide Call Stack 

at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.EnsureDocument(IDesignerSerializationManager manager)
at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager)
at System.ComponentModel.Design.Serialization.BasicDesignerLoader.BeginLoad(IDesignerLoaderHost host)  

Это ошибка на конструкторе? Я что-то не так делаю? Есть ли какое-то решение этой проблемы?

Спасибо за вашу помощь

1 Ответ

16 голосов
/ 12 января 2010

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

Например:

class Generic<T> : UserControl
{
}

тогда

class GenericInt : Generic<int> { }

затем используйте GenericInt вместо Generic. Отстой, я знаю.

...