Ошибки времени разработки в конструкторе Windows Forms - PullRequest
2 голосов
/ 14 декабря 2010

У меня есть эти классы в том же пространстве имен:

public partial class BaseForm : Form
{    
    bool isNew = false;

    public BaseForm() {}


    public BaseForm(bool isNew)
    {
       InitializeComponent();

       this.isNew = isNew;
    }
    .
    .
    . 
}

public partial class BitSetForm : BaseForm
{

    public BitSetForm(bool isNew) : base(isNew)
    {
        InitializeComponent();           
    }

    new private void InitializeComponent()
    {
        .
        .
        .
    }
}

1) И я получил это предупреждение: Не удалось найти тип "..BaseForm". Убедитесь, что сборка, содержащая этот типссылки.Если этот тип является частью вашего проекта разработки, убедитесь, что проект был успешно построен с использованием настроек для вашей текущей платформы или любого процессора.

2) Ошибки времени разработки в конструкторе Windows Forms появляются и скрывают панель дизайна win-формы BitSetForm.

Что это значит?Что я могу сделать, чтобы снова отобразить панель дизайна экрана win-формы BitSetForm?

Ответы [ 3 ]

5 голосов
/ 14 декабря 2010

Вам необходимо добавить конструктор без параметров к вашему BaseForm.
Это может быть даже private;он просто должен существовать.

Без него конструктор не может создать экземпляр BaseForm для отображения в области конструктора.

Не забудьте вызвать InitializeComponent в конструкторе.

2 голосов
/ 14 декабря 2010

Как уже упоминалось @SLaks, вам нужен InitializeComponent в конструкторе вашего класса.Я бы на самом деле имел его в экземпляре без параметров.Затем в конструкторе вашего логического значения я бы изменил на

public partial class BaseForm : Form 
{         
    bool isNew = false;      

    public BaseForm() 
    { 
        InitializeComponent(); 
    }

    public BaseForm(bool isNew) : this()
    {        

        this.isNew = isNew;
    }
}  

Так что, если у вас есть другие вещи, которые вы хотите выполнить в определении BaseForm независимо от параметризованного запуска, это тоже будет вызвано.Таким образом, InitializeComponent запускается в любом случае.

2 голосов
/ 14 декабря 2010

Ну, пара вещей ...

  1. Вам нужно создать приложение, прежде чем дизайнер сможет создать экземпляр вашего базового класса.Это может быть очень сложно, если в вашей форме подкласса есть куча ошибок.
  2. Разработчик может создать экземпляр класса, который имеет конструктор по умолчанию без параметров.Это значит, что BaseForm вашего базового класса (bool isNew) никогда не будет вызываться дизайнером.Это означает, что InitializeComponent тоже не будет.Вы должны переместить InitializeComponent в конструктор без параметров, чтобы второй конструктор вызвал первый.
  3. InitializeComponent является закрытым по умолчанию.Вы не должны изменять его видимость на защищенный, и поскольку он является закрытым, модификатор new не требуется.
  4. InitializeComponent никогда не должен быть связан таким образом с базовым классом.Его должен вызывать только конструктор.

Учитывая все эти проблемы, я настоятельно рекомендую либо отказаться от наследования Windows Forms, либо, по крайней мере, переместить базовый класс в отдельную сборку.Я пробовал это много раз, и это больше проблем, чем стоит.

Главное, что нужно помнить, это то, что при просмотре формы в конструкторе дизайнер не создает экземпляр формы, которую вывидите - это создание экземпляра базового класса.Во время выполнения это явно не так.Поэтому очень часто можно увидеть различное поведение во время выполнения / разработки.

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