2010-12-03 8 views
0

Visual Studio создали этот код:Winform: Почему я не могу перенести инициализацию из InitializeComponent?

private void InitializeComponent() 
    { 

     this.trackBar1 = new System.Windows.Forms.TrackBar(); 

Я просто хочу, чтобы сделать это вместо того, чтобы:

private void instantiate() 
    { 

     this.trackBar1 = new System.Windows.Forms.TrackBar(); 
    } 

    private void InitializeComponent() 
    { 

     instantiate(); 

Программа компиляции и выполнения, но Visual Studio не может сделать контроль над WinForm больше. Как это исправить?

Обновление: Я знаю, что код генерируется автоматически, но почему на земле, когда он выполняется во время выполнения не во время разработки, он не выполняется как обычный код C#?

Я действительно подозреваю, что Microsoft, как Apple, делаешь все, что жесткое для кодеров плотных их к их язю, вы должны быть на самом деле Шерлок Холмс запроса :)

http://cocoawithlove.com/2009/02/interprocess-communication-snooping.html

+2

Любая конкретная причина * почему * вы хотите это сделать? В любом случае, вы действительно не должны модифицировать метод InitializeComponent`. Этот код автоматически генерируется дизайнером и предпочитает оставаться в покое. – 2010-12-03 16:04:35

+0

Потому что я хочу упорядочить код по-своему :) и даже сам сгенерировать его, так что легче создавать отдельные модули, которые будут в частичных классах. – user310291 2010-12-04 13:39:54

+0

@ user310291: Поверьте мне на этом - Microsoft просто не в лиге Apple, когда дело доходит до того, чтобы сделать вещи сложными для кодеров. – MusiGenesis 2010-12-05 01:06:56

ответ

4

InitializeComponent() является методом автоматически генерируется дизайнер. Если вы его измените, дизайнер может не иметь возможности загрузить ваш контроль, и могут произойти другие забавные вещи.

Что именно вы хотите достичь?

+0

У меня есть проект с несколькими платформами, и я старался иметь такую ​​же организацию кода. Эта зависимость Visual Studio раздражает меня. Прежде всего, я не вижу причин, по которым они это делали, это своего рода проприетарное назначение по какой-либо причине, чем протекционизм. – user310291 2010-12-04 13:46:18

1

Visual Studio показывает только, что находится в файле * .designer.cs. Если вы перемещаете что-то за его пределами, оно не будет знать, какие элементы управления вы хотите отображать.

Если вы создаете элемент управления вне InitializeComponent, не забудьте добавить его в форму Control collection.

this.Controls.Add(trackBar1); 
1

Если вы хотите, чтобы добавить элементы управления и т.д. в форму без использования конструктора, то сделать это в методе instantiate(), но называть instantiate() из конструктора элемента управления, а не путем редактирования методы InitializeComponent().

Никогда не рекомендуется вручную редактировать метод, созданный и поддерживаемый IDE (при этом вручную редактируется любой код, который исходит от генератора кода).

2

Обратите внимание на сообщение об ошибке, что дизайнер показывает:

Метод 'System.Windows.Forms.Form.instantiate' не найден.

Он жалуется Форма класса не имеющим Instantiate метода не ваша форма производного класса, который действительно есть метод. Это неизбежно, тип еще не существует до тех пор, пока он не будет десериализован, он может отражать только элементы базового класса.

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

Смежные вопросы